考虑下面的代码
#include <cstdio>
#include <memory>
struct Base1
{
Base1() = default;
virtual ~Base1() = default;
//~Base1() = default;
};
struct Base2 : public Base1
{
Base2()
{
printf("%s:%d:%s\n", __FILE__, __LINE__, __func__);
}
~Base2() // non-virtual destructor
{
printf("%s:%d:%s\n", __FILE__, __LINE__, __func__);
}
};
struct Derive : public Base2
{
Derive()
{
printf("%s:%d:%s\n", __FILE__, __LINE__, __func__);
}
~Derive()
{
printf("%s:%d:%s\n", __FILE__, __LINE__, __func__);
}
};
int main()
{
std::unique_ptr<Base2> d = std::make_unique<Derive>();
return 0;
}
类
Base2
没有虚拟析构函数,但是它继承了具有虚拟析构函数的Base1
。代码
std::unique_ptr<Base2> d = std::make_unique<Derive>();
试图删除Base2
类型的对象上的Derive
,我期望只调用Base2
的dtor,而不是Derive
。但实际上它可以正常工作:
main.cpp:15:Base2
main.cpp:27:Derive
main.cpp:31:~Derive
main.cpp:19:~Base2
因此,看起来只要“真实”基类(此处为
Base1
)具有虚拟dtor,就不需要所有继承的类都具有虚拟dtor,对吗?如果是,我在哪里可以找到与此相关的文档?
最佳答案
是的,如果一个类的基类的destructor声明为virtual
,则其析构函数也将为virtual
;不管是否明确将其声明为virtual
。
从标准[class.dtor]/13
(强调我的)