c++ - 如果调用了子类的析构函数,是否可以停止调用其基类的析构函数?

标签 c++ destructor

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

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

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

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

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

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

最佳答案

如果 D 实例被析构,B 类析构函数将被调用是正确的。 D dtor 中对 delete ab; 的调用是一个错误。

这段代码要考虑的另一件事是,因为 B 的 dtor 不是虚拟的,所以你不能通过 B< 删除 D 的实例 指针。

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

关于c++ - 如果调用了子类的析构函数,是否可以停止调用其基类的析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39014186/

相关文章:

java - Java有析构函数吗?

c++ - 对 'operator delete(void*)' 的 undefined reference

c++ - 新建/删除[] 和 VirtualAlloc

c++ - 在成员为 const 和列表初始化的情况下,对非静态成员的使用无效?

c++ - 以高效的方式创建、访问、存储和加载 boost::bimap

c++ - cpp从需要父类(super class)对象的函数访问子类对象方法

c++ - 如何手动删除类的实例?

c++ - 在 ifstream 上调用 clear() 有问题吗?

c++ - 如何控制销毁堆对象的顺序?

c++ - 在赋值运算符中析构和重建对象是一个坏主意吗?