我有一个基类A
和一个派生类B
。
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 :(得分: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所述:运行时多态性需要使用指针或引用
另一个重要的事情是:在创建类层次结构时,总是让你的基类析构函数为虚拟或者你会遇到内存问题