如果调用了子类的析构函数,我可以停止对其基类的析构函数的调用吗?

时间:2016-08-18 09:10:58

标签: c++ destructor

我遇到了一些奇怪的代码,如下所示:

class B {
    int* ab;
    ///...
    ~B() { /// not virtual
        delete ab;
    }
    ///...
}

class D : public B {
    int* ad;
    ///...
    ~D() {
        delete ab;
        delete ad;
    }
    ///...
}

但在我看来,子类的析构函数肯定会调用其基类的析构函数。所以,我认为子类不需要释放由其基类分配的资源。因此,无需在类delete ab的析构函数中添加D。更糟糕的是,delete一个对象两次是错误的。

但是,这段代码在我们的systmem中运行很长时间并通过我们的整个测试用例。在这种奇怪的实现中还有其他考虑因素吗?

所以我徘徊,如果调用子类的析构函数,那么,无论发生什么,基类的析构函数都将在稍后调用。
或者,在执行子类的析构函数之后,有没有办法停止执行基类的析构函数?

1 个答案:

答案 0 :(得分:2)

如果a B实例被破坏,那么将调用D类析构函数是正确的。 <{1}} dtor中对delete ab;的调用是一个错误。

此代码需要考虑的另一件事是,由于D的dtor不是虚拟的,因此您无法通过B指针删除D的实例。< / p>

B的DTOR在两种情况下都是错误的,但绝对应该改变。如果您计划以多态方式使用类的层次结构,那么您还必须将D DTOR更改为虚拟。