3

关于将继承自两个类的对象插入列表的以下代码是否存在问题?

class A
{
}

class B
{
}

class C : public A, public B
{

}

C *myObj = new C();
std::list<A*> myList;
myList.push_front(myObj);

创建类型 A 的列表并插入属于类型 B 的类型 C 的对象是否有问题?我知道这段代码可以编译,但我很担心内存问题。如果这是一个问题,我还有什么其他选择来解决这个问题?

4

2 回答 2

3

只要列表通过引用或指针存储数据并且析构函数是虚拟的,就可以了。

基本问题是不允许将 C 存储到 的变量中A,但可以将其存储到A&orA*中。所以A a = C()就像将 C 存储到list<A>or中一样糟糕vector<A>。这将导致切片

于 2012-12-05T18:25:35.110 回答
0

从技术上讲,只要您将对象的引用或指针添加到列表中以避免切片并具有虚拟析构函数,您就应该是安全的。

您可以将AandB视为多态类型的接口。看看这个例子:

class Drawable
{
    public:
        virtual ~Drawable() { }
        virtual void draw();
};

class Circle : public Drawable
{
    public:
        void draw() { std::cout << "Drawing a circle\n"; }
}

class Square : public Drawable
{
    public:
        void draw() { std::cout << "Drawing a square\n"; }
}

int main()
{
    std::list<Drawable*> shapeList { new Square(), new Circle(), new Square() };
}
于 2012-12-05T18:43:51.840 回答