即使B
的析构函数不是virtual
,我仍然可以通过B
指针调用C
的析构因子。
这是否意味着只有最外层的抽象类才需要virtual
析构函数?
如果是这样,为什么它会这样工作?
是因为B
继承了A
的析构函数吗?
#include <iostream>
struct A {
virtual ~A() {
std::cout << "~An";
}
virtual void
function_a() = 0;
};
struct B : A {
/*
virtual ~B() {
std::cout << "~Bn";
}
*/
virtual void
function_b() = 0;
};
struct C : B {
~C() override {
std::cout << "~Cn";
}
void
function_a() override {
std::cout << "function_an";
}
void
function_b() override {
std::cout << "function_bn";
}
};
int
main() {
B * b = new C();
b->function_a();
b->function_b();
delete b;
}
B
和C
的析构函数也是virtual
。析构函数不会被继承,但如果基类的析构函数是virtual
,则派生的析构因子会覆盖它,并且也是virtual
;不管是否明确指定CCD_ 13。
即使析构函数不是继承的,如果基类声明其析构函数
virtual
,派生的析构函数也总是覆盖它。
和
Derived类中的此函数也是
virtual
(无论关键字virtual
是否在其声明中使用(,并覆盖Base::vf
(无论单词override
是否在其宣布中使用(。