指南#4 link text,声明:
基类析构函数应该是 公共和虚拟,或 受保护和非虚拟。
可能我错过了一些东西,但是如果我只是创建一个具体的类,那么它不是用作基类的。
我应该声明它的析构函数是公共的还是虚拟的?通过这个我隐含地判断我的类“已经准备好被用作基类”,而这不是必须的。
答案 0 :(得分:5)
链接文本具体说“基类析构函数应该”......
指南仅适用于设计用作基类的类。如果要创建一个不会用作基类的单个具体类,则应该将公共构造函数保留为非虚拟类。
答案 1 :(得分:0)
如果你的班级中没有其他东西是虚拟的,我认为析构函数也不应该是虚拟的。
答案 2 :(得分:0)
如果您的课程稍后会延期,您的析构函数只需要是虚拟的。我不知道你需要一个受保护/私有析构函数的情况。
值得注意的是,如果你有一个一个虚拟方法,你就不会失去任何东西(大多数编译器)也会使析构函数变为虚拟(但是如果有人延伸,它会保护你)。 / p>
答案 3 :(得分:0)
另一种方式考虑一下:你知道没有人会绝对试图从你的班级中衍生出来吗?当有人这样做时你会认为他会记得仔细看看你的dtor吗?有时候人们使用继承而不是合成(有充分的理由提供你的类的完整界面而没有丑陋的getter语法) 虚拟dtor的另一点是Open/Closed Principle 如果你不关心硬实时性能或类似的东西,我会选择虚拟dtor。
答案 4 :(得分:0)
在以下任何一种情况下,析构函数都应虚拟:
罕见异常:
关于公共或受保护 - 一般来说,更多的问题是你打算如何控制对析构函数的访问。
答案 5 :(得分:0)
该建议引用具有虚函数的类,旨在成为多态基类。你必须确保如果有人在基类指针上调用delete
,那么就会调用实际类的析构函数;否则,将不释放派生类分配的资源。
有两种方法可以实现这一目标:
delete
。对于不会用作基类的具体类,您只能在指向实际类型的指针上调用delete
,因此该建议不适用。如果需要,它应该有一个公共非虚拟析构函数。