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