我在stl容器(实际是堆栈)中存储具有公共父对象的对象,但是在其内部的对象上调用虚函数会导致在此公共父级中调用实现。请参阅演示代码:
#include <iostream>
#include <stack>
using namespace std;
class Z
{
public:
virtual void echo()
{
cout << "this is Z\n";
}
int x;
};
class A: public Z
{
public:
virtual void echo()
{
cout << "this is A\n";
}
};
int main()
{
A a;
a.x = 0;
Z z;
z.x = 100;
stack<Z> st;
st.push(a);
st.top().echo(); // prints "This is Z"
cout << "x = " << st.top().x << endl; // prints 0
st.push(z);
st.top().echo(); // prints "This is Z"
cout << "x = " << st.top().x << endl; // prints 100
return 0;
}
答案 0 :(得分:2)
通常,对象和多态的容器不会混合:当你将它们推入时,你将<{1}}类型的对象切割到A
类型的对象中容器(因为容器确实期望并存储Z
)
使用sizeof(Z)
或std::stack<Z*>
来操纵指向基类的指针。
答案 1 :(得分:2)
您有slicing:
您应该使用std::stack<Z*>
或std::stack<std::unique_ptr<Z>>
。
答案 2 :(得分:2)
您观察到的是切片。您的堆栈存储Z
个对象,因此即使您构造一个A
对象,它也不会存储在堆栈中 - Z
对象将从A
构造并存储
如果需要多态,则不能按值存储在容器中。使用stack<unique_ptr<Z>>
。