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

Should I mark my derived class destructors virtual/override?

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

If a base class destructor is declared virtual, one should avoid declaring derived class destructors virtual or override. Some code base and tools might insist on override for destructors, but that is not the recommendation of these guidelines.

果然,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,特别是具有(至少)确保您正确指定基础 class 析构函数为 virtual 的优势,我的问题归结为以下具体部分:

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

当使用 override 指定析构函数时,存在无法编译的不一致编译器:https://msdn.microsoft.com/en-us/library/xfzxhe2a.aspx

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

代码越少越好。不使用冗余 virtual.

可以节省 7 个字符
  • 反驳论点:7 个字符节省不了多少。

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

  • 反驳:这可能是一个完全假设的情况。当然很少见。

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

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