即使B
的析构函数不是virtual
,我仍然可以通过C
指针调用B
的析构函数。
这是否意味着只有最外面的抽象类需要具有virtual
析构函数?
如果是这样,为什么它会这样工作?
是否是B
继承了A
的析构函数?
#include <iostream>
struct A {
virtual ~A() {
std::cout << "~A\n";
}
virtual void
function_a() = 0;
};
struct B : A {
/*
virtual ~B() {
std::cout << "~B\n";
}
*/
virtual void
function_b() = 0;
};
struct C : B {
~C() override {
std::cout << "~C\n";
}
void
function_a() override {
std::cout << "function_a\n";
}
void
function_b() override {
std::cout << "function_b\n";
}
};
int
main() {
B * b = new C();
b->function_a();
b->function_b();
delete b;
}
B
和C
的析构函数也都是virtual
。析构函数将不会被继承,但是如果基类的析构函数为virtual
,则派生的析构函数将覆盖它并为virtual
;是否指定virtual
。
即使不继承析构函数,但如果基类将其析构函数声明为虚拟的,则派生的析构函数始终会覆盖它。
和
然后,Derived类中的此函数也是虚拟的(在其声明中是否使用了关键字virtual,并且重写了Base :: vf(在声明中是否使用了override这个词)。