2017-03-20 64 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