我正在研究文件描述符的类层次结构,其中基类持有一个 int 并在销毁期间调用 close
并且子类不添加任何虚拟方法或数据成员,只是它们的构造不同(例如,named_file_filedes
采用路径并在 ctor 中使用 open
初始化基础)或非虚拟成员函数(例如,您只能调用 kevent
在 kqueue_filedes
上)。鉴于此,基类是否需要虚拟析构函数?子类的大小都是一样的,而且它们都没有自定义销毁逻辑。标记为 c++11
,因为这是我的目标标准版本。
如果您打算通过删除
基类指针来销毁派生类对象,则需要一个虚拟
析构函数。如:
class Foo {};
class Bar : public Foo {}
int main()
{
Foo* f = new Bar;
delete f; // << UNDEFINED BEHAVIOR without virtual destructor in base classe
}
如果您需要对象是多态的,您还需要至少 1 个 virtual
方法——例如,如果您打算使用 dynamic_cast
来从基础到派生。通常在这种情况下会提供一个虚拟析构函数。只有一个虚拟析构函数就足以确保该类是多态的。