如果后代类没有非静态成员或析构函数,是否需要虚拟析构函数?

时间:2014-02-21 14:56:31

标签: c++ c++11 virtual-destructor

我正在使用文件描述符的类层次结构,其中基类包含int并在销毁期间调用close,子类不添加任何虚拟方法或数据成员,只是不同在他们的构造中(例如named_file_filedes采用路径并在ctor中使用open初始化基础)或非虚拟成员函数(例如,您只能在{{1}上调用kevent }})。鉴于此,基类是否需要虚拟析构函数?子类的大小完全相同,并且没有一个具有自定义销毁逻辑。标记kqueue_filedes,因为这是我定位的标准版本。

2 个答案:

答案 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()

相关问题