在带有虚析构函数的基类的子类中不指定析构函数是否安全?
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();
还是virtual ~Foo();
,或者两者都不输入,都是如此,只允许编译器生成隐式定义的析构函数。
安全。你只需要确保基类中的析构函数是virtual
。
只要你的基类析构函数是virtual
,编译器就会按照正确的顺序调用所有的析构函数。
在大多数派生类中是否需要析构函数取决于该类本身&这个决定通常是根据三规则做出的。
是的,它是安全的。
隐式生成的析构函数将是虚函数,因为存在一个带有虚析构函数的基类,并且将正确调用所有重要成员和基类的析构函数。
相关文章:
- 析构函数是否会自动调用 delete[] C++?
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 文件流析构函数是否可以在C++中引发异常?
- 构造函数是否unique_ptr初始化原始指针unique_ptr析构函数是否也删除关联的原始指针?
- 析构函数是否可以在 const 对象上调用非 const 函数
- cpp 中的析构函数是否自动调用?即使析构函数没有提及非动态变量,它们也会被删除吗?
- 析构函数是否可以不调用特定字段的析构函数
- 动态分配(堆上)的对象的析构函数是否会在返回函数中自动调用
- 当类中存在虚函数时,隐式生成的析构函数是否也是虚拟的
- C++析构函数是否始终或仅在有时调用数据成员析构函数
- 根据C++标准,显式调用构造函数和析构函数是否安全
- std:map 析构函数是否调用键析构函数以及值析构函数?
- QNetworkAccessManager 析构函数是否中止当前请求
- 基类析构函数是否阻止生成移动构造函数
- 琐碎的析构函数是否会导致混叠
- 全局变量构造函数/析构函数是否需要线程保护
- 多态类的隐式析构函数是否可以成为虚拟的
- 默认的虚拟析构函数是否阻止编译器生成的移动操作
- 析构函数是否自动为成员变量解除分配堆内存
- 对象的析构函数是否释放用于创建对象的指针所指向的内存?