具体类的析构函数

时间:2009-11-10 21:02:52

标签: c++ virtual-destructor

指南#4 link text,声明:

  

基类析构函数应该是   公共和虚拟,或   受保护和非虚拟。

可能我错过了一些东西,但是如果我只是创建一个具体的类,那么它不是用作基类的。

我应该声明它的析构函数是公共的还是虚拟的?通过这个我隐含地判断我的类“已经准备好被用作基类”,而这不是必须的。

6 个答案:

答案 0 :(得分:5)

链接文本具体说“基类析构函数应该”......

指南仅适用于设计用作基类的类。如果要创建一个不会用作基类的单个具体类,则应该将公共构造函数保留为非虚拟类。

答案 1 :(得分:0)

如果你的班级中没有其他东西是虚拟的,我认为析构函数也不应该是虚拟的。

答案 2 :(得分:0)

如果您的课程稍后会延期,您的析构函数只需要是虚拟的。我不知道你需要一个受保护/私有析构函数的情况。

值得注意的是,如果你有一个一个虚拟方法,你就不会失去任何东西(大多数编译器)也会使析构函数变为虚拟(但是如果有人延伸,它会保护你)。 / p>

答案 3 :(得分:0)

另一种方式考虑一下:你知道没有人会绝对试图从你的班级中衍生出来吗?当有人这样做时你会认为他会记得仔细看看你的dtor吗?有时候人们使用继承而不是合成(有充分的理由提供你的类的完整界面而没有丑陋的getter语法) 虚拟dtor的另一点是Open/Closed Principle 如果你不关心硬实时性能或类似的东西,我会选择虚拟dtor。

答案 4 :(得分:0)

在以下任何一种情况下,析构函数都应虚拟:

  • 您的课程包含 ANY 虚拟方法。
  • 即使没有任何虚拟内容,您也打算使用类作为基础。

罕见异常

  • 你试图保存4个字节,虚拟表指针是不可接受的解决方案因为这个(例如 - 由于某种原因你的类HAS要适合32位)。但要为地狱做好准备。

关于公共或受保护 - 一般来说,更多的问题是你打算如何控制对析构函数的访问。

答案 5 :(得分:0)

该建议引用具有虚函数的类,旨在成为多态基类。你必须确保如果有人在基类指针上调用delete,那么就会调用实际类的析构函数;否则,将不释放派生类分配的资源。

有两种方法可以实现这一目标:

  • 一个公共虚拟析构函数,所以在运行时找到了正确的析构函数;或
  • 受保护的非虚析构函数,它阻止在基类指针上调用delete

对于不会用作基类的具体类,您只能在指向实际类型的指针上调用delete,因此该建议不适用。如果需要,它应该有一个公共非虚拟析构函数。