(C ++继承)在stl容器中存储具有公共父对象的对象

时间:2014-08-26 13:09:01

标签: c++ inheritance virtual-functions

我在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;
}

3 个答案:

答案 0 :(得分:2)

通常,对象和多态的容器不会混合:当你将它们推入时,你将<{1}}类型的对象切割A类型的对象中容器(因为容器确实期望并存储Z

的对象

使用sizeof(Z)std::stack<Z*>来操纵指向基类的指针。


另请参阅:What is the slicing problem in C++?

答案 1 :(得分:2)

您有slicing

您应该使用std::stack<Z*>std::stack<std::unique_ptr<Z>>

答案 2 :(得分:2)

您观察到的是切片。您的堆栈存储Z个对象,因此即使您构造一个A对象,它也不会存储在堆栈中 - Z对象将从A构造并存储

如果需要多态,则不能按值存储在容器中。使用stack<unique_ptr<Z>>