说我有两个基类,
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
.