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

时间:2013-04-10 20:01:16

标签: c++ inheritance abstract-class

删除抽象类而不是孩子是否可以?是否所有的分配都会被解除分配?

请考虑以下情况作为示例,但请不要将您的答案限制在一个案例中:

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

是的,如果不知道实际派生类型delete a指向的是什么,a完全没问题。

正如shivakumar指出的那样,如果不使基类的析构函数为虚拟,那么删除派生类将不会最终调用基类的析构函数。在你的琐碎例子中,这不是问题,但在现实生活中,你应该总是让你的析构函数变得虚拟。

答案 2 :(得分:0)

如果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();
};