不会用于删除对象的基类的析构函数应该是虚拟的吗?

Should the destructor for a base class that you won't use to delete an object, be virtual?

本文关键字:虚拟 基类 用于 删除 对象 析构函数      更新时间:2023-10-16

>假设我有两个基类,

struct A {}; 
struct B {}; 

以及使用多重继承的派生版本

struct D : A, B {}; 

如果我的使用场景是这样的:

A *obj = new D; 

即我永远不会使用 B 基类来引用派生对象,我是否必须使两个基的析构函数都虚拟?我目前正在声明B的析构函数protected禁止其他用户这样做,但这足够吗?

D的析构函数呢?

只要B*从未用于删除派生对象,B 的析构函数就不必是虚拟的。参见 [expr.delete]/3:

。如果要删除的对象的静态类型与其 动态类型,静态类型应是要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义。

在这种情况下,"静态类型"是 T cv 的类型,其中要delete的操作数的类型为 T cv * 。因此,您情况下的要求是强加给A的,而不是B