说我有两个基类,
struct A {};
struct B {};
以及使用多重继承
的派生版struct D : A, B {};
如果我的使用场景是这样的:
A *obj = new D;
即。我永远不会使用B
基类来引用派生对象,我是否必须使两个基础的析构函数虚拟?我目前宣称B
的析构函数为protected
,禁止其他用户这样做,但这还够吗?
D
的析构函数怎么样?
答案 0 :(得分:7)
只要B
永远不会用于删除派生对象,B*
的析构函数就不必是虚拟的。见[expr.delete] / 3:
...如果要删除的对象的静态类型与其不同 动态类型,静态类型应是要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义。
在这种情况下,“静态类型”是类型T
cv ,其中delete
的操作数具有类型T
cv *
。因此,您的案例中的要求会强加于A
,而不是B
。