如果后代类没有非静态成员或析构函数,我是否需要虚拟析构函数
Do I need a virtual destructor if descendant classes have no non-static members or destructors?
>我正在玩弄文件描述符的类层次结构,其中基类包含一个 int 并在销毁期间调用close
,子类不添加任何虚拟方法或数据成员,只是它们的构造不同(例如,named_file_filedes
采用路径并使用 ctor 中的open
初始化基)或非虚拟成员函数(例如,您只能在kqueue_filedes
上调用 kevent
)。鉴于此,基类是否需要虚拟析构函数?子类的大小都相同,它们都没有自定义销毁逻辑。标记为c++11
,因为这是我的目标标准版本。
如果您打算通过delete
基类指针来销毁派生类对象,则需要一个virtual
析构函数。 如:
class Foo {};
class Bar : public Foo {}
int main()
{
Foo* f = new Bar;
delete f; // << UNDEFINED BEHAVIOR without virtual destructor in base classe
}
如果你要求对象是多态的,你还需要在 base 中至少 1 个virtual
方法——例如,如果你打算使用 dynamic_cast
从 base 转到派生。 在这种情况下,通常会提供虚拟析构函数。 只有一个虚拟析构函数就足以确保类是多态的。
如果通过指向基类的指针delete
派生类,则无论派生类的外观如何,如果没有虚拟析构函数,行为都将是未定义的。
C++11 标准,§5.3.5/3:
如果要删除的对象的静态类型与其 动态类型,静态类型应是要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义。
但是,如果类仅在构造函数上不同,请考虑使用派生的替代方法,例如简单的自由函数,如 create_named_file()
。
相关文章:
- 析构函数是否会自动调用 delete[] C++?
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 文件流析构函数是否可以在C++中引发异常?
- 构造函数是否unique_ptr初始化原始指针unique_ptr析构函数是否也删除关联的原始指针?
- 析构函数是否可以在 const 对象上调用非 const 函数
- cpp 中的析构函数是否自动调用?即使析构函数没有提及非动态变量,它们也会被删除吗?
- 析构函数是否可以不调用特定字段的析构函数
- 动态分配(堆上)的对象的析构函数是否会在返回函数中自动调用
- 当类中存在虚函数时,隐式生成的析构函数是否也是虚拟的
- C++析构函数是否始终或仅在有时调用数据成员析构函数
- 根据C++标准,显式调用构造函数和析构函数是否安全
- std:map 析构函数是否调用键析构函数以及值析构函数?
- QNetworkAccessManager 析构函数是否中止当前请求
- 基类析构函数是否阻止生成移动构造函数
- 琐碎的析构函数是否会导致混叠
- 全局变量构造函数/析构函数是否需要线程保护
- 多态类的隐式析构函数是否可以成为虚拟的
- 默认的虚拟析构函数是否阻止编译器生成的移动操作
- 析构函数是否自动为成员变量解除分配堆内存
- 对象的析构函数是否释放用于创建对象的指针所指向的内存?