虚拟析构函数用例

Virtual destructor use cases

我读过一些文章,正如他们所说,主要的虚拟析构函数用例是:

我认为,也可能存在没有动态数据分配的情况,所有层次结构中都没有虚方法,但派生的析构函数仍然可以在删除时执行一些关键任务(同步、解锁等)。我们需要在 base class 中使用虚拟 d-r。可能这种情况是设计不良的结果。

但是无论如何,一些 public class 的开发者不能 100% 知道,如果派生 class 是否会在 d-r 中使用一些虚拟方法,或者分配动态数据。所以,我说得对吗,任何未声明为 final 的 public class 都必须将 d-r 声明为虚拟的?只有 final 关键字保证任何指向此 class 的指针将始终是这种类型,因此可以安全地非虚拟地删除。

如果通过指向基 class 的指针删除派生对象,那么(并且只有在那时)基 class 析构函数必须是虚拟的。否则就是undefined behaviour。暂无其他相关规定。

如果 class 无论如何都有一个虚函数,那么就不会引入任何开销。如果 class 没有任何其他虚函数,那么基础 class 设计者必须考虑增加虚拟析构函数的运行时惩罚与 [= 的用户的风险之间的权衡18=] 可能会尝试通过基 class 指针删除派生对象。

Here is a link to a similar discussion, with Standard quotes