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

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

假设我有两个碱基 classes,

struct A {}; 
struct B {}; 

和使用多重继承的派生

struct D : A, B {}; 

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

A *obj = new D; 

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

D的析构函数呢?

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

... if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined.

在这种情况下,"static type" 是类型 T cv 其中 delete 的操作数具有类型 T cv*。所以你的情况的要求是强加于 A,而不是强加于 B.