1

可以删除抽象类而不是子类吗?所有的分配都会因此被释放吗?

以以下情况为例,但请不要将您的答案仅限于该情况:

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 类的其他方法中合理使用这样的结果。

4

3 回答 3

2

您必须在基类中有虚拟析构函数,否则不会发生派生类的完全破坏。

struct A {
    virtual void fun() = 0;
virtual ~A()
   {
    }
};
于 2013-04-10T20:02:50.303 回答
1

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

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

于 2013-04-10T20:05:19.097 回答
0

If A has a virtual destructor then both destructors of A and B are succesfully called (first B then A) ,

If you do not declare the constructor of A as virtual, then only the destructor of A is called during deletion and extended data of B may leak.

struct A {
   virtual void fun() = 0;
   virtual ~A();
};
struct B : public A {
   void fun() { /* actually doing something here. */ }
   ~B();
};
于 2013-04-10T20:06:51.073 回答