我应该标记我的派生类析构函数virtual / override吗?

时间:2018-05-15 15:58:12

标签: c++ override virtual destructor

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

  

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

果然,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,我的问题归结为以下特定部分:< / p>

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

1 个答案:

答案 0 :(得分:-1)

  1. 支持不在派生类析构函数上指定... override的参数是什么,如果有的话?
  2. 当使用overridehttps://msdn.microsoft.com/en-us/library/xfzxhe2a.aspx指定析构函数时,有一些不符合要求的编译器无法编译。

    1. 如果有的话,支持在派生类析构函数中指定virtual ...的参数[隐式虚拟时]是什么?
    2. 更少的代码更好。通过不使用冗余virtual来保存7个字符。

      • 反驳论点:7个字符没有太大的节省。

      可能有一个设计决定是为基类及其所有子项创建一个非虚拟的析构函数非虚拟。如果严格遵循此指南(未指定冗余virtual),则只需要修改基数。否则,必须修改层次结构中的每个子项(或至少检查它们是否单独指定virtual。)

      • 反驳论点:这可能是一个完全假设的情况。当然很少见。
      1. 在您看来,我是否应该更倾向于铿锵有力的建议,还是倾向于C ++核心指南建议?
      2. 在我看来,唯一具有重要意义的论点是旧的Visual Studio编译器的不一致性,因此我不会在析构函数上使用override。否则它很重要,你可以遵循你喜欢的任何指导方针,或者甚至不打扰任何一方 - 当手头的主题没有区别时,一致性并不重要。