[英]Is it safe to not specify a destructor in a subclass of a base class with a virtual destructor?
考虑一个简单的接口/实现设计:
class Base
{
public:
virtual ~Base()
{
// Virtual empty destructor
}
};
class Derived : public Base
{
public:
virtual ~Derived()
{
// Lots of clean up code here
// ...
}
};
通过这种设计,我明白以下代码是安全有效的:
Base* base = new Derived();
delete base; // Both Base::~Base and Derived::~Derived get called
但是,想象一下如果有一个新类:
class DerivedEx : public Derived
{
public:
// No destructor here, relying on default destructor generated by compiler
};
DerivedEx “安全”吗?
为了安全起见,我一直认为我必须在DerivedEx 中实现一个虚拟的空析构函数。 但我想知道这是否是多余的和不必要的,以及是否有任何我不知道的“陷阱”。
是的,它还是安全的。
如果任何基类析构函数是虚拟的,则析构函数自动是虚拟的。 无论您键入~Foo();
都是如此~Foo();
或virtual ~Foo();
或者两者都不做,只允许编译器生成隐式定义的析构函数。
这是安全的。 您只需要确保基类中的析构函数是virtual
。
只要您的基类析构函数是virtual
的,编译器就会负责以正确的顺序调用所有析构函数。
您是否需要在大多数派生类中使用析构函数取决于该类本身,并且该决定通常是基于三原则做出的。
是的,这是安全的。
隐式生成的析构函数将是虚拟的,因为有一个带有虚拟析构函数的基类,并且会正确调用所有非平凡成员和基类的析构函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.