【发布时间】: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