2014-02-21 60 views
1

我玩弄文件描述符的类层次结构,其中基类保存一个int并在销毁过程中调用close并且子类不添加任何虚拟方法或数据成员,只是它们的构造有所不同(例如named_file_filedes需要一个路径并使用ctor中的open或非虚拟成员函数(例如,您只能在kqueue_filedes上调用kevent)初始化基础。鉴于此,基类是否需要虚拟析构函数?子类的大小都是一样的,没有一个具有自定义的销毁逻辑。标记为c++11,因为这是我定位的标准版本。如果后代类没有非静态成员或析构函数,我是否需要虚拟析构函数?

回答

4

如果delete通过指针到基类派生类,则行为将是不确定的无虚析构函数,无论派生类的外观。

C++ 11标准,§5.3.5/ 3:

如果对象的静态类型要被删除是从它的 动态类型不同,静态类型应是基类的动态类型的对象被删除,静态类型应具有虚拟析构函数或行为是不确定的。

但是,如果类仅在它们的构造函数中有所不同,请考虑使用派生的替代方法,例如,简单的免费功能,如create_named_file()

5

如果打算通过基类指针销毁派生类对象,则需要一个virtual析构函数。如:

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从基地去的。在这种情况下通常提供虚拟析构函数。只有虚拟析构函数足以确保类是多态的。