我想知道在处理多级继承时实现虚拟析构函数的正确方法是什么。
所以让我介绍一下这个简单的例子:
#include <iostream>
using namespace std;
struct A {
virtual ~A() { cout << "~A()" << endl; }
};
struct B : A {
~B() { cout << "~B()" << endl; }
};
struct C : B {
~C() { cout << "~C()" << endl; }
};
struct D : B {
~D() { cout << "~D()" << endl; }
};
int main() {
A* a = new C();
B* b = new D();
delete a;
delete b;
}
所以afaik,当基类将其析构函数声明为虚拟时,它将在删除后正确调用其子代的析构函数。我担心的是,当我同时在删除a 和删除b 两种情况下运行此代码时,子代被正确销毁了,而我当时认为只有删除a才能达到目的。
这是正确的行为吗?如果是这样,是否意味着A的每个子类都将其析构函数声明为虚拟的,即使未明确指定它也可以安全地假定它们将被正确删除?