您不会用于删除对象的基类的析构函数是虚拟的吗?

Lor*_*ins 2 c++ destructor protected multiple-inheritance virtual-destructor

说我有两个基类,

struct A {}; 
struct B {}; 
Run Code Online (Sandbox Code Playgroud)

以及使用多重继承的派生类

struct D : A, B {}; 
Run Code Online (Sandbox Code Playgroud)

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

A *obj = new D; 
Run Code Online (Sandbox Code Playgroud)

即我永远不会使用B基类来引用派生对象,我是否必须使两个基础的析构函数虚拟?我目前正在申报的析构函数Bprotected禁止从这样其他用户,但是否足够?

析构函数怎么样D

Bri*_*ian 7

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

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

在这种情况下,"静态类型"是类型T cv,其中操作数delete具有类型T cv *.因此,您的案件中的要求是强制性的A,而不是强制性的B.