class 需要既是派生又是基础的虚拟析构函数?
Virtual destructor needed for class which is both derived and base?
假设我们有以下内容:
#include <iostream>
struct A
{
virtual ~A() { std::cout << "destr A\n"; }
};
struct B : A
{
// no need to be virtual?
~B() { std::cout << "destr B\n"; }
};
struct C : B
{
~C() { std::cout << "destr C\n"; }
};
现在,我创建了一个 C
的实例并将其分配给其基数 class B
.
的指针
int main()
{
B* b = new C{};
delete b;
return 0;
}
输出为:
destr C
destr B
destr A
让我有点惊讶的是对象被正确销毁了(调用了所有三个析构函数)。根据输出,我会说 ~B()
是一个虚拟析构函数:~B()
分派到 ~C()
,然后 ~B()
完成,最后 ~A()
被调用。这个说法正确吗?
我知道,如果基 class 的某些函数是虚拟的,则派生 class 中覆盖基 class 中的函数的函数也是虚拟的。我不知道析构函数也是如此。 ~B()
是虚拟的,因为我用 virtual
函数说明符声明了 ~A()
吗?
Is ~B()
virtual because I declared ~A()
with the virtual
function specifier?
是的。每 https://timsong-cpp.github.io/cppwp/n4659/class.dtor#10:
If a class has a base class with a virtual destructor, its destructor (whether user- or implicitly-declared) is virtual.
假设我们有以下内容:
#include <iostream>
struct A
{
virtual ~A() { std::cout << "destr A\n"; }
};
struct B : A
{
// no need to be virtual?
~B() { std::cout << "destr B\n"; }
};
struct C : B
{
~C() { std::cout << "destr C\n"; }
};
现在,我创建了一个 C
的实例并将其分配给其基数 class B
.
int main()
{
B* b = new C{};
delete b;
return 0;
}
输出为:
destr C
destr B
destr A
让我有点惊讶的是对象被正确销毁了(调用了所有三个析构函数)。根据输出,我会说 ~B()
是一个虚拟析构函数:~B()
分派到 ~C()
,然后 ~B()
完成,最后 ~A()
被调用。这个说法正确吗?
我知道,如果基 class 的某些函数是虚拟的,则派生 class 中覆盖基 class 中的函数的函数也是虚拟的。我不知道析构函数也是如此。 ~B()
是虚拟的,因为我用 virtual
函数说明符声明了 ~A()
吗?
Is
~B()
virtual because I declared~A()
with thevirtual
function specifier?
是的。每 https://timsong-cpp.github.io/cppwp/n4659/class.dtor#10:
If a class has a base class with a virtual destructor, its destructor (whether user- or implicitly-declared) is virtual.