【发布时间】:2013-06-10 05:12:05
【问题描述】:
来自 C++ 常见问题解答:
[11.4] 我可以为我的班级重载析构函数吗? 没有。
我意识到这意味着您无法更改返回类型、参数类型或参数数量。我可能对单词的语法感到困惑,但是是否可以覆盖父级的析构函数?
class Child : public Parent {
public:
virtual Parent::~Parent() {
// New definition
}
};
那么递归呢?
class Grandchild : public Child {
public:
Child::Parent::~Parent() {
// An even newer definition
}
};
我读过this 和related post,这让我觉得因为析构函数不是继承的,它们不能被覆盖,但我从未见过它明确说明过。
编辑:我对此进行了更改以反映我想要覆盖父级的析构函数这一事实,请注意子级和孙子级覆盖 ~Parent()。
我这样做的主要原因是为了维护 Parent 的接口,同时改变它的销毁方式(子类的全部原因)。我将有其他东西来管理所有 Parent 的创建,并在我选择的稍后时间显式调用它们的析构函数。
【问题讨论】:
-
就像你说的,析构函数不是继承的。当子对象析构时,它会调用它自己的析构函数加上它的父析构函数。在子类中覆盖父母析构函数没有什么意义。
-
@yngum 当然析构函数是继承的。如果您没有在覆盖父类的子类中提供析构函数,则实际上是在继承基类析构函数。在派生类中重写父类的析构函数很有意义,就像您在下面给出的一些示例中看到的那样。
-
@PhilipStuyck:析构函数是不继承的。如果你不声明析构函数,编译器会为你生成一个。隐式析构函数执行后自动调用基类析构函数。请参阅我的答案中的标准报价。
-
@PhilipStuyck:考虑一下,如果派生类继承了基类的析构函数,派生类的成员将如何销毁?
-
@PhilipStuyck:“......因此他们被继承了。”不,不继承析构函数。 12.4/3:“如果类没有用户声明的析构函数,则隐式声明析构函数。”
标签: c++ inheritance overriding destructor multiple-inheritance