我玩弄文件描述符的类层次结构,其中基类保存一个int并在销毁过程中调用close
并且子类不添加任何虚拟方法或数据成员,只是它们的构造有所不同(例如named_file_filedes
需要一个路径并使用ctor中的open
或非虚拟成员函数(例如,您只能在kqueue_filedes
上调用kevent
)初始化基础。鉴于此,基类是否需要虚拟析构函数?子类的大小都是一样的,没有一个具有自定义的销毁逻辑。标记为c++11
,因为这是我定位的标准版本。如果后代类没有非静态成员或析构函数,我是否需要虚拟析构函数?
1
A
回答
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
从基地去的。在这种情况下通常提供虚拟析构函数。只有虚拟析构函数足以确保类是多态的。
相关问题
- 1. 没有虚拟构造函数但是虚拟析构函数
- 2. 虚拟析构函数 - 有需要时
- 3. 如果基类析构函数是虚拟的,是否需要派生类析构函数定义?
- 4. 是否需要定义一个虚拟析构函数?
- 5. C++虚拟析构函数
- 6. CRT虚拟析构函数
- 7. 虚拟析构函数?
- 8. C++虚拟析构函数
- 9. 非RAII类是否需要用户定义的析构函数?
- 10. 类有虚函数和可访问的非虚拟析构函数
- 11. 静态析构函数
- 12. “只有非静态成员函数可以是虚拟的”
- 13. 多态类中的虚析构函数
- 14. 静态变量的析构函数库的析构函数
- 15. 虚拟析构函数如何工作?
- 16. C++需要析构函数
- 17. 如何从基类中调用非虚拟的析构函数?
- 18. 从没有虚拟析构函数的类继承
- 19. 是否有一个静态构造函数/析构函数帮助主题
- 20. 基类“解释”没有非析构虚函数
- 21. VB6类是否具有析构函数?
- 22. AS3是否有类析构函数?
- 23. CoffeeScript是否有类析构函数?
- 24. 非多态和非抽象基类中的虚析构函数
- 25. 是否有必要在对象析构函数中调用“string”成员的析构函数?
- 26. 需要构造函数/析构函数/类型转换错误
- 27. 使用隐形模式时需要虚拟析构函数吗?
- 28. 以下哪种情况下需要虚拟析构函数?
- 29. 派生类与非虚拟析构函数
- 30. 虚拟析构函数分段错误