【问题标题】:Which base class's virtual destructor is overriden in a derived class在派生类中重写了哪个基类虚拟析构函数
【发布时间】:2018-07-06 08:46:39
【问题描述】:

当派生类不是立即派生而是从已经派生的类派生时,我对重写函数感到困惑。

#include <iostream>

struct Base
{ 
    virtual ~Base() { std::cout << "Base destructor called\n"; }
};

struct Derived : Base
{
    Derived() {}
    // Implicitly supplied destructor, I'm guessing. Which is also virtual?
};

struct MostDerived : Derived
{
    MostDerived(){};
    ~MostDerived() { std::cout << "MostDerived destructor called\n"; }
};

int main()
{
    Derived* d = new MostDerived();
    delete d;
    Base* b = new MostDerived();
    delete b;
}

在这两种情况下,都会调用 MostDerived 的析构函数。我想知道是否只要求最基类有一个声明为虚拟的析构函数,在这种情况下,所有其他从它继承的类都有虚拟析构函数,如果你明白我的意思,它们会覆盖上游的所有其他析构函数。

我不确定我是否有道理,基本上如果我有一系列 10 个类,每个类都继承自最后一个类,那么链中的任何析构函数都会覆盖所有比它更基础的析构函数?

struct GreatGrandfather{~virtual GreatGrandfather(){}}; // Only this is necessary
struct Grandfather : GreatGrandfather {};
struct Father : Grandfather{};
struct Son : Father{};
struct Grandson : Son {};
struct GreatGrandson : Grandson{};

Grandson 的析构函数会覆盖它上面的所有类,但不会覆盖 GreatGrandson 的析构函数?

而且,一旦基类的析构函数或其他函数被声明为虚拟,它的任何后代都不需要再次声明为虚拟?

【问题讨论】:

  • 一旦方法是virtual,继承的方法仍然是virtual,即使没有重复virtual或添加override。析构函数也是如此。
  • // Implicitly supplied destructor, I'm guessing. Which is also virtual? - 是的,它也是虚拟的

标签: c++ class inheritance virtual destructor


【解决方案1】:

链中的任何析构函数都会覆盖所有比它更基础的析构函数?

是的,差不多。如果您不编写析构函数,则实现将隐式提供析构函数。所以它也会隐式覆盖基类 d'tor。

Grandson 的析构函数会覆盖它上面的所有类,但不会覆盖 GreatGrandson 的析构函数?

它将覆盖Son 的d'tor。通过扩展覆盖Father's 等等。所以是的。并且它不能覆盖GreatGrandson,因为在它的定义点它不能展望未来并且知道GreatGrandson 将存在。

而且,一旦基类的析构函数或其他函数被声明为虚拟,它的后代都不需要再次声明为虚拟?

是的,与任何虚函数一样。一旦声明为虚拟,它在任何派生类中始终是虚拟的。

【讨论】:

    【解决方案2】:

    析构函数会覆盖基类的所有虚拟析构函数,包括间接基类。此外,覆盖虚函数的函数本身就是虚函数。因此,是的,Derived 的隐式定义的析构函数是虚拟的,~Base~Derived 都被~MostDerived 覆盖。当使用指向基类的指针来销毁派生类类型的对象时,需要虚拟的析构函数是基类的析构函数。 (派生类中的那个将是隐式虚拟的。)

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 2013-11-01
      • 2019-05-18
      • 2021-08-22
      • 2011-11-16
      • 2020-09-30
      • 2021-03-20
      • 2021-05-09
      • 2015-04-16
      相关资源
      最近更新 更多