可以删除抽象类而不是子类吗?

Is it ok to delete an abstract class instead of a child?

本文关键字:子类 删除 抽象类      更新时间:2023-10-16

是否可以删除抽象类而不是子类?所有的分配会因此被重新分配吗?

考虑以下情况作为例子,但请不要将你的答案限制在一种情况:

struct A {
    virtual void fun() = 0;
};
struct B : public A {
    void fun() { /* actually doing something here. */ }
};
struct C {
    A *a;
    void OneTask() {
        // (...)
        a = new B();
    }
    void AnotherTask() { /* using fun() in some way. */ }
    ~C() { delete a; }
};

这个想法是有OneTask()的多个可能的结果,导致一个指针的赋值,从a继承不同的类,B只是一个例子;然后在AnotherTask()和c类的其他方法中合理地使用这些结果。

必须在基类中使用虚析构函数,否则派生类不会完全销毁。

struct A {
    virtual void fun() = 0;
virtual ~A()
   {
    }
};

是的,对于delete a来说,不知道a实际指向的派生类型是什么是完全可以的。

正如shivakumar所指出的,如果不将基类的析构函数设为虚函数,那么删除派生类最终不会调用基类的析构函数。在您的简单示例中,这不是问题,但在实际生活中,您应该始终将析构函数设置为虚函数。

如果A有虚析构函数,则A和B的析构函数都被成功调用(首先是B,然后是A),

如果不将A的构造函数声明为虚函数,则在删除时只调用A的析构函数,并且B的扩展数据可能会泄漏。

struct A {
   virtual void fun() = 0;
   virtual ~A();
};
struct B : public A {
   void fun() { /* actually doing something here. */ }
   ~B();
};