【问题标题】:Should I mark my derived class destructors virtual/override?我应该将派生类析构函数标记为虚拟/覆盖吗?
【发布时间】:2018-05-15 15:58:12
【问题描述】:

C++ 核心指南包含关于virtualoverridefinal 说明符的following advice,特别是与派生类析构函数相关:

如果基类析构函数声明为虚拟,则应避免将派生类析构函数声明为虚拟或覆盖。一些代码库和工具可能会坚持对析构函数进行覆盖,但这不是这些指南的建议。

果然,clang-tidy 是违反建议的工具之一。 如果我没有指定virtualoverride,则运行clang-tidy 会发出以下警告:

warning: annotate this function with 'override' or (rarely) 'final' [modernize-use-override]

或者,如果指定为virtual

warning: prefer using 'override' or (rarely) 'final' instead of 'virtual' [modernize-use-override]

我的问题

鉴于指定override 具有(至少)确保您正确地将基类析构函数指定为virtual 的优势,我的问题归结为以下具体部分:

  1. 如果有的话,哪些论据支持在派生类析构函数上指定virtualoverride
  2. 在您看来,我应该更倾向于 clang-tidy 建议还是 C++ 核心指南建议?

【问题讨论】:

  • 这是每个人都在谈论的问题,在每个人的脑海中,以及(有时)在每个人的卧室里。
  • 这是一个很好的问题,但我认为这里离题了:这是基于意见的。你应该直接加入github上的讨论。
  • @YSC 1. 不基于意见。

标签: c++ overriding virtual destructor


【解决方案1】:
  1. 如果有的话,支持在派生类析构函数中不指定 ...override 的论点是什么?

当使用override:https://msdn.microsoft.com/en-us/library/xfzxhe2a.aspx指定析构函数时,有不符合标准的编译器编译失败。

  1. 如果有的话,有什么论据支持在派生类析构函数上不指定 virtual ... [当它是隐式虚拟时]?

代码越少越好。通过不使用多余的virtual,您可以节省 7 个字符。

  • 计数器参数:7 个字符并不能节省多少。

可能有一个设计决定,使以前的虚拟析构函数对于基类及其所有子类都是非虚拟的。如果严格遵循此准则(不指定冗余virtual),则只需修改基础。否则必须修改层次结构中的每个子级(或至少检查它们是否分别指定virtual)。

  • 反驳论点:这可能是完全假设的情况。当然非常罕见。

  1. 在您看来,我应该更倾向于 clang-tidy 建议还是 C++ 核心指南建议?

在我看来,唯一具有重要意义的论点是旧的 Visual Studio 编译器的不一致性,因此我宁愿在析构函数上不使用 override 也会犯错。否则,这无关紧要,您可以遵循您喜欢的任何指导方针,或者甚至不必费心遵循任何一个 - 当手头的主题没有区别时,一致性并不重要。

【讨论】:

    猜你喜欢
    • 2014-01-01
    • 2016-03-26
    • 2011-11-16
    • 2021-08-22
    • 2017-04-21
    • 2021-03-20
    • 2016-02-05
    • 2018-12-23
    • 2020-12-15
    相关资源
    最近更新 更多