您不会用来删除对象的基 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
.
假设我有两个碱基 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
.