C++ 应该为您赢得的基类指定析构函数';不用于删除对象,是否为虚拟对象?

C++ 应该为您赢得的基类指定析构函数';不用于删除对象,是否为虚拟对象?,c++,destructor,multiple-inheritance,protected,virtual-destructor,C++,Destructor,Multiple Inheritance,Protected,Virtual Destructor,假设我有两个基类 struct A {}; struct B {}; 以及使用多重继承的派生继承 struct D : A, B {}; 如果我的使用场景是这样的: A *obj = new D; i、 e.我永远不会使用B基类来引用派生对象,我必须使两个基类的析构函数都是虚拟的吗?我现在将B的析构函数声明为protected以禁止其他用户这样做,但这足够了吗 D的析构函数呢 只要不使用B*来删除派生对象,B的析构函数就不必是虚拟的。见[expr.delete]/3: 。。。如果要

假设我有两个基类

struct A {}; 
struct B {}; 
以及使用多重继承的派生继承

struct D : A, B {}; 
如果我的使用场景是这样的:

A *obj = new D; 
i、 e.我永远不会使用
B
基类来引用派生对象,我必须使两个基类的析构函数都是虚拟的吗?我现在将
B
的析构函数声明为
protected
以禁止其他用户这样做,但这足够了吗


D
的析构函数呢

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

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


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

否,但是你应该这样做。如果你永远不会将
D
称为
B
,你可能会有兴趣引用强大的Scott Meyers:…在一个类中声明一个虚拟析构函数,当且仅当该类至少包含一个虚拟函数。@RawN另一方面,Herb Sutter说,“基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的。”@Brian so,当你结合经验法则时:如果基类有虚拟函数,那么将析构函数设置为公共的和虚拟的,否则将析构函数设置为受保护的和非虚拟的。