【发布时间】:2020-06-19 08:12:44
【问题描述】:
即使B的析构函数不是virtual,我仍然可以通过B指针调用C的析构函数。
这是否意味着只有最外层的抽象类需要有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 是否是虚拟的。 〜A是虚拟的,〜B怎么可能不是? ~C 也一样,它也会是虚拟的。因为 ~A 是虚拟的。仅仅因为您没有明确将其标记为虚拟并不意味着它不是。
标签: c++ inheritance overriding abstract-class virtual