如果您不使用基类的析构函数来删除对象,那么它是虚拟的吗?

时间:2017-01-17 23:49:14

标签: c++ destructor multiple-inheritance protected virtual-destructor

说我有两个基类,

struct A {}; 
struct B {}; 

以及使用多重继承

的派生版
struct D : A, B {}; 

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

A *obj = new D; 

即。我永远不会使用B基类来引用派生对象,我是否必须使两个基础的析构函数虚拟?我目前宣称B的析构函数为protected,禁止其他用户这样做,但这还够吗?

D的析构函数怎么样?

1 个答案:

答案 0 :(得分:7)

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

  

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

在这种情况下,“静态类型”是类型T cv ,其中delete的操作数具有类型T cv *。因此,您的案例中的要求会强加于A,而不是B