【问题标题】:non-virtual destructors in c++ with overridec ++中的非虚拟析构函数具有覆盖
【发布时间】:2021-03-27 22:34:55
【问题描述】:

是的,我看过很多关于在 C++ 中使用关键字 virtualoverride 的析构函数的帖子。我也认为我了解用法:

  • 如果基类有虚析构函数,而派生类重写了它,如果签名不同,程序将因重写而无法编译。

但是我想知道 - 或者我在某人的代码中也多次看到它是这样使用的:

class Base
{
   public:
          ~Base();
};

class Derived : public Base
{
   public:
         ~Derived() override;
};

在基类中对非虚函数的析构函数进行覆盖是否实际上对程序/编译或任何东西有任何影响?还是只是在这种情况下使用不当?

【问题讨论】:

  • 那不会编译。
  • GCC:error: 'Derived::~Derived()' marked 'override', but does not override
  • 什么不会编译?为什么,因为过度“覆盖”?
  • @malajedala 是的,您不必在派生类中重复“virtual”关键字,尽管我建议您这样做(以避免刚刚遇到的那种混淆)。

标签: c++ virtual destructor


【解决方案1】:

您的代码无法编译,因为 Base::~Base 不是虚拟的。

哦,好吧,也许我已经监督了这一点:如果 Base 类派生自 另一个类,比如 SuperBase 类 - 它有一个虚拟析构函数, 那么 Base 的析构函数将是虚拟的而不使用关键字 对吧?

正确。如果一个方法在基类中是虚拟的,那么在子类中具有相同名称和相同签名的方法也将是隐式虚拟的。 virtual关键字可以省略。

一个好的做法是始终在要覆盖的方法上使用关键字override。这有两个很大的优点:它使人类读者清楚该方法是虚拟的并且被覆盖,并且它避免了一些错误,该方法被缩进以覆盖,但它默默地没有(例如const不匹配)。

析构函数是一种特殊情况,因为它们会覆盖父虚拟析构函数,即使它们具有不同的名称。

【讨论】:

  • 尽管这一切都是正确的,但您可以添加关于“特殊析构函数案例”的评论,因为尽管它们具有“不同的名称”,但它们可以被覆盖(和虚拟的)。
猜你喜欢
  • 2017-04-21
  • 2012-09-21
  • 2015-09-02
  • 2011-11-16
  • 2011-12-19
  • 2011-03-10
  • 2012-04-18
  • 2018-01-28
相关资源
最近更新 更多