从 C++ 中的两个类继承并插入到列表中

inherit from two classes in c++ and inserting into list

本文关键字:继承 列表 两个 插入 C++      更新时间:2023-10-16

下面的代码是否与将继承自两个类的对象插入列表有关?

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 类型的对象是否有问题?我知道这段代码可以编译,但我对内存问题很感兴趣。如果这是一个问题,我还有什么其他选择来解决这个问题?

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

就可以了。

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

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

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

class Drawable
{
    public:
        virtual ~Drawable() { }
        virtual void draw();
};
class Circle : public Drawable
{
    public:
        void draw() { std::cout << "Drawing a circlen"; }
}
class Square : public Drawable
{
    public:
        void draw() { std::cout << "Drawing a squaren"; }
}
int main()
{
    std::list<Drawable*> shapeList { new Square(), new Circle(), new Square() };
}