在派生类中重写哪个基类的虚拟析构函数

斑马鱼

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

#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的析构函数。我想知道是否仅要求最基本的类具有一个声明为virtual的析构函数,并且在这种情况下,所有继承自该类的其他类都具有虚构的析构函数,如果您了解我的意思,这些析构函数将覆盖其他更上游的析构函数。

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

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

孙子的析构函数将覆盖其上面的所有类,但不是大孙子的析构函数?

而且,一旦将基类的析构函数或其他函数声明为虚拟的,则无需再次将其子代声明为虚拟的吗?

讲故事的人-Unslander Monica

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

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

孙子的析构函数将覆盖其上面的所有类,但不是大孙子的析构函数?

它将覆盖Son'd'tor。扩展覆盖Father的等等。是的 而且它无法覆盖GreatGrandson,因为在其定义时,它无法展望未来并知道GreatGrandson将存在。

而且,一旦将基类的析构函数或其他函数声明为虚拟的,则无需再次将其子代声明为虚拟的吗?

是的,与任何虚拟功能相同。一旦声明为虚拟,它在任何派生类中始终是虚拟的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

虚拟析构函数在基类和派生类中均未调用

如果基类析构函数是虚拟的,派生类的析构函数是否默认为虚拟?

我应该将派生类的析构函数标记为虚拟/重写吗?

从基类析构函数调用派生类方法

C ++派生类和虚拟析构函数

在派生类构造函数中引发异常。为什么调用基类析构函数而不是派生类析构函数?

在派生类中声明非虚拟析构函数是否安全?

C ++ 11在派生类中删除的析构函数

在C ++继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数

虚拟析构函数,如果在派生类中没有析构函数,会发生什么情况?

当唯一的派生类不添加任何额外变量时,省略虚拟析构函数

派生类中的私有重写虚拟函数

具有虚拟析构函数的基类的子类中的默认析构函数

即使基类和派生类仅使用原始数据类型,我是否仍需要定义虚拟析构函数?

为什么要调用派生类的析构函数?

多态类中的虚拟析构函数

C ++多态性:派生类调用基类虚拟函数,而不是重写的派生类

添加自定义析构函数时,Move构造函数在派生类中消失

在C ++中从派生类的析构函数调用虚函数

派生类中的析构函数标记为noexcept(false)

在派生类中定义析构函数需要复制赋值运算符

C++11:我可以显式调用基类析构函数来销毁派生类吗?

如果派生类仅包含自动变量成员,是否有必要使用虚拟析构函数?

从派生类中删除虚拟函数

(为什么)在纯虚拟派生类中是否需要虚拟基类构造函数调用?

C ++ Qt基类虚拟析构函数

纯抽象基类的虚拟析构函数

虚拟基类函数中派生类的大小

在基类构造函数中对派生类使用重写函数