我正在使用文件描述符的类层次结构,其中基类包含int并在销毁期间调用close
,子类不添加任何虚拟方法或数据成员,只是不同在他们的构造中(例如named_file_filedes
采用路径并在ctor中使用open
初始化基础)或非虚拟成员函数(例如,您只能在{{1}上调用kevent
}})。鉴于此,基类是否需要虚拟析构函数?子类的大小完全相同,并且没有一个具有自定义销毁逻辑。标记kqueue_filedes
,因为这是我定位的标准版本。
答案 0 :(得分:5)
如果您打算通过virtual
基类指针销毁派生类对象,则需要delete
析构函数。如:
class Foo {};
class Bar : public Foo {}
int main()
{
Foo* f = new Bar;
delete f; // << UNDEFINED BEHAVIOR without virtual destructor in base classe
}
如果您要求对象具有多态性,那么您还需要在基础中至少使用一个virtual
方法 - 例如,如果您打算使用dynamic_cast
从基础到派生。通常在这种情况下提供虚拟析构函数。只有一个虚拟析构函数就足以确保该类具有多态性。
答案 1 :(得分:4)
如果delete
通过指向基类的指针派生类,那么无论派生类的外观如何,行为都将在没有虚拟析构函数的情况下被定义。
C ++ 11 Standard,§5.3.5/ 3:
如果要删除的对象的静态类型与其不同 动态类型,静态类型应是要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义。
但是,如果类仅在其构造函数中有所不同,请考虑使用派生的替代方法,例如:简单的免费功能,如create_named_file()
。