【问题标题】:Is the destructor of a derived class virtual by-default if the base class destructor is virtual?如果基类析构函数是虚拟的,则派生类的析构函数是否默认为虚拟?
【发布时间】:2021-08-22 20:04:43
【问题描述】:

我最近在阅读有关虚函数和虚析构函数的内容,引发了以下问题。

例如,我有以下继承链。

class Base
{
public:
    virtual ~Base() // note: virtual
    {
        std::cout << "Calling ~Base()\n";
    }
};
 
class Derived: public Base
{
 
public:
 
    ~Derived() 
    {
        std::cout << "Calling ~Derived()\n";
    }
};

我读到基类的虚函数在派生类中默认为隐式虚函数。所以,我认为这同样适用于析构函数。

我想知道,派生类的析构函数是否默认为虚拟。如果没有,如果您提供一些解释,我会很高兴。

【问题讨论】:

  • 您也可以使用~Derived() override { std::cout &lt;&lt; "..."; } 来确保它是一个虚函数(如果您忘记将~Base 设置为虚拟函数,则使其成为编译时错误)

标签: c++ polymorphism virtual-destructor


【解决方案1】:

我认为这同样适用于析构函数

确实如此,是的。

我想知道,如果派生类的析构函数默认是虚拟的

在这个例子中,是的。

一旦某事物被标记为virtual,那么该事物的所有覆盖后代也都是virtual,无论他们是否明确声明

所以,如果一个方法是virtual,所有覆盖它的派生方法也是virtual。如果析构函数是virtual,则所有派生析构函数也是virtual

【讨论】:

  • 非常感谢。
  • 如果编译器确切知道要调用哪个方法,在调用Derived::~Derived() 时仍然可以避免虚拟调度: 1. 它是final。 2. 类型为final。 3. 数组删除调用。 4. 确切的完全派生类型因其他原因而已知。
  • 关于这一点,我认为这与 cpp 核心 guideline 相关(C.35:基类析构函数应该是公共的和虚拟的,或者受保护的和非虚拟的)
猜你喜欢
  • 2012-06-26
  • 2018-06-29
  • 2013-11-01
  • 2017-02-10
  • 2011-11-16
  • 1970-01-01
  • 2021-03-20
  • 2012-11-03
  • 2015-02-24
相关资源
最近更新 更多