2017-03-20 63 views
1

我有一個基類A和派生類BC++強制轉換爲基類

class A { 
public: 
    int x; 
    virtual int getX() { 
     return x; 
    } 
}; 

class B : public A { 
public: 
    int y; 
}; 

虛函數是有這只是爲了多態。 接下來我宣佈的A名單「不過是把B的內線:

vector<A> list; 
B b1,b2; 
b1.y = 2; 
b2.x = 10; 

list.push_back(b1); 
list.push_back(b2); 

現在我想去過的矢量的所有元素,並訪問y成員(只B的有):

for (auto it = list.begin(); it != list.end(); ++it) { 
    B &cast = dynamic_cast<B&>(*it); 
    int value = cast.y; 
    std::cout << value << std::endl; 
} 

此代碼給出了運行時錯誤。任何想法我怎麼能做演員和訪問y

+0

你不能。看看[object slicing](http://stackoverflow.com/questions/274626/what-is-object-slicing)是什麼。 –

回答

1

發生了什麼是object slice

一個實現你所尋找的方法是:

#include <vector> 
#include <iostream> 

using namespace std; 

class A { 
    public: 
    int x; 
    virtual int getX() { 
     return x; 
    } 

    virtual ~A() = default; 
}; 

class B : public A { 
    public: 
    int y; 
}; 

int main() { 
    vector<A*> list; 
    B b1,b2; 
    b1.y = 2; 
    b2.x = 10; 

    list.push_back(&b1); 
    list.push_back(&b2); 

    for (auto it = list.begin(); it != list.end(); ++it) { 
    B* cast = dynamic_cast<B*>(*it); 
    int value = cast->y; 
    std::cout << value << std::endl; 
    } 

    return 0; 
} 

在此示例代碼中,我們使用指針,以避免對象片。
如前所述通過cdhowie:運行時多態性需要使用指針或引用

另一個重要的事情:創建類層次結構的時候,總是讓你的基類的析構函數虛擬否則你將有記憶問題

+3

相關點:運行時多態*要求*使用指針或引用。在運行時,值不能是多態的。 – cdhowie