c++ - 我应该将我的派生类析构函数标记为虚拟/覆盖吗?

标签 c++ overriding virtual destructor

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

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 尤其具有(至少)确保您已将基类析构函数正确指定为 virtual 的优势,我的问题归结为以下具体部分:

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

最佳答案

  1. 如果有的话,支持不在派生类析构函数上指定 ...override 的论点是什么?

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

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

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

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

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

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

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

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

关于c++ - 我应该将我的派生类析构函数标记为虚拟/覆盖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50354559/

相关文章:

c++ - 为什么会导致错误?

C++ 11初始化程序具有模棱两可的函数id表达式?

java - 覆盖和返回类型兼容性

java - 重写java中的方法约束

c - 显示完整的 Linux 命令行(gcc 输出)? (虚拟机上的c编程)

c++ - 使用 C++ 编译器编译 Apache

c++ - 试图理解 "template <class U> friend class B;"语法

java - 如何让子类覆盖父类的值,但使用父类的方法

c++ - 重新定义和覆盖函数之间的区别

c++ - 模板虚函数