【问题标题】:Is it safe to declare non-virtual destructor in the derived class在派生类中声明非虚析构函数是否安全
【发布时间】:2015-08-19 21:59:09
【问题描述】:

在节目中:

struct A
{
    virtual ~A(){ }
};

struct B : A
{
    ~B(){ }
};
int main(){ }

标准N4296::12.4/9

如果一个类有一个带有虚析构函数的基类,它的析构函数 (无论是用户声明还是隐式声明)是虚拟的。

所以,编译器会自行将结构B 中的析构函数重新声明为虚函数,对吗?那么为什么允许我们声明这样的析构函数呢?其他开发人员可能会感到有些困惑。

【问题讨论】:

  • 我猜是这样,如果你省略virtual 关键字,它会从它的基类继承它的虚拟性。
  • 所有功能的工作方式相同。是的,这有点令人困惑。

标签: c++ inheritance destructor virtual-functions


【解决方案1】:

无论您声明virtual 与否,覆盖虚成员函数的函数始终是虚函数。因此B::~B() 总是虚拟的,因为A::~A() 是虚拟的。

【讨论】:

  • 来自标准的一些证明参考?
  • @DmitryBundin:您已经在问题中引用了标准中的相关句子。目前还不清楚您可能还在寻找什么。
  • @GregHewgill 我只引用了关于 destrctuors 的部分,但 timrau 又在谈论所有虚函数。
【解决方案2】:

是的。你的理解是对的。

那么为什么允许我们声明这样的析构函数呢?

我同意你的观点,这有点令人困惑,但你可以通过从基类中删除 virtual 来删除所有基类和派生类的函数的虚拟性。

【讨论】:

  • “您可以通过从基类中删除虚拟来删除所有基类和派生类的函数的虚拟性。” - 一般来说,通过“更少的类型”来证明降低可读性是一件坏事,因为“代码的读取次数比编写的次数多”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 2011-11-16
  • 2015-04-16
  • 2021-08-22
  • 1970-01-01
  • 2012-09-09
  • 2013-11-01
相关资源
最近更新 更多