gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:02:10 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com