【问题标题】:Should the destructor for a base class that you won't use to delete an object, be virtual?不用于删除对象的基类的析构函数是否应该是虚拟的?
【发布时间】:2017-06-02 05:19:22
【问题描述】:

假设我有两个基类,

struct A {}; 
struct B {}; 

以及使用多重继承

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

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

A *obj = new D; 

即我永远不会使用B 基类来引用派生对象,我是否必须将两个基的析构函数设为虚拟?我目前将B 的析构函数声明为protected 以禁止其他用户这样做,但这是否足够?

D 的析构函数呢?

【问题讨论】:

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

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


【解决方案1】:

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

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

在这种情况下,“静态类型”是 T cv 类型,其中 delete 的操作数的类型为 T cv *。所以你的情况的要求是针对A,而不是B

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2011-03-31
    • 2021-08-22
    • 2013-10-05
    • 2019-04-20
    • 2019-09-05
    • 2016-12-23
    • 2020-06-07
    • 2011-03-16
    相关资源
    最近更新 更多