gpt4 book ai didi

c++ - 覆盖析构函数 - C++

转载 作者:搜寻专家 更新时间:2023-10-31 00:50:15 26 4
gpt4 key购买 nike

假设我有:

struct Base
{
/**/ virtual /**/ ~Base() {/*..*/}
// ...
};

struct Derived : Base
{
~Derived() /* override */ {/*..*/}
// ...
};

当一个类从另一个类继承时,覆盖在这里帮助我确保我正在实现一个实际存在于 Base 中的函数。在上述场景中,Derived 类与 Base 的名称不同,因此其析构函数的编写方式也不同。

我的问题是,如果我想使用 override,我应该在哪里使用它?我在哪里真正实现派生类中的 Base 函数?

最佳答案

首先,“override”关键字仅表示“此函数在某些基类中被标记为虚拟”,仅此而已。它也可以应用于析构函数。然而析构函数是特殊的,一般规则不适用于它们。例如 Derived 中名为 ~Derived() 的析构函数与 Base 中名为 ~Base() 的析构函数相匹配>,即使它们在形式上有不同的名称(或者它们是什么?这里的名称是什么?)。

析构函数和典型函数之间的另一个区别是析构函数总是在继承链中被调用,而不管实现。所以你不能“取代”破坏,你只能“扩展”它。请注意(与普通函数不同)从派生析构函数调用基类析构函数是错误的。

链式销毁调用从您当前引用的类开始。我的意思是

Base* inst = new Derived();
delete inst;

将调用 ~Base(),因为变量 instBase*,即使它是从派生类构造的。此时“虚拟逻辑”适用:如果 ~Base() 不是虚拟的,则为 Base 类触发正常的销毁过程,而不知道实际对象是 Derived*,即 ~Base() 和它所有的父描述器(在这个特殊情况下没有)被执行。这是错误的。但如果它是虚拟的,那么它实际上会跳转到正确的类 Derived,并调用正确的销毁程序:首先是 ~Derived(),然后是 ~基础()See this godbolt.org并尝试:在基本析构函数中添加和删除“虚拟”以查看差异(仅查看左列,具有彩色背景的行是实际调用的行)。

总而言之:是的,您可以使用 ~Derived() override {}。我总是在适当的地方使用“覆盖”,很高兴知道哪些函数是从虚拟派生的。经验法则是:如果 Base 是虚拟的(意味着任何函数都是虚拟的),那么它的析构函数也应该是虚拟的。记住这一点,它会帮助你避免一些问题。

关于c++ - 覆盖析构函数 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58029416/

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