为啥在 C++ 中覆盖是可选的?

Posted

技术标签:

【中文标题】为啥在 C++ 中覆盖是可选的?【英文标题】:Why is override optional in C++?为什么在 C++ 中覆盖是可选的? 【发布时间】:2016-03-24 21:46:01 【问题描述】:

我了解C++ override 的用途,但是与其他高级语言相比,它的实现有点困惑,默认情况下需要使用它。

C++11 wiki page 将其描述为“声明符属性的技术标识符”,但没有详细说明为什么它不仅仅是该语言的关键字。

【问题讨论】:

添加 override 作为关键字可能会破坏(旧)使用它作为标识符的代码。 "[覆盖增益] 仅当用于那些特定的尾随 [attribute] 上下文时作为属性的特殊含义" 它是可选的,部分原因是许多人认为使用它会导致更多的并发症而不是它解决的问题。 【参考方案1】:

保持与 C++03 的向后兼容性是可选的。将其设为非可选会破坏所有代码*

同样,将override 设为关键字会破坏任何使用名称override 的代码。


好的,不是字面上的所有代码,而是很多。

【讨论】:

啊,我没有意识到向后兼容是 C++11 的一个如此高的目标,但委员会列出的是 literally the first design goal。 @nonathaj 是的,如果不是这样,C++ 的糟糕程度会大大降低 :-) 一些编译器,比如 Clang 会检测到“你在一些代码中使用了override,所以当它在其他地方丢失时我会警告你”。换句话说,它试图强制使用它。 @juanchopanza 题外话了,但老实说,如果它不能向后兼容,那么在接下来的十年里,我们仍然会处理仅限 C++98 的遗留代码库......当然,如果我们“打碎了几个鸡蛋”,新的代码库就不会那么糟糕了,但我认为我们现在拥有的是最好的折衷方案。好吧,直到我们获得可以免费更新您的代码库的完美重构工具 clang-modernize 有一个选项可以在您的代码库中自动添加覆盖。【参考方案2】:

从技术上讲,C++11 的行为与此处的 Java 没有太大不同(这是您提到的“其他高级语言”之一的典型示例)。 错误 override 将是编译错误,就像 Java 中的错误 @Override 一样。 缺少 override 不会是编译错误,就像缺少 @Override 在 Java 中不会是编译错误一样。

我能看到的唯一真正区别是 Java 工具传统上对检测丢失的@Override 有更好的支持,并且传统上鼓励 Java 用户将相应的警告视为错误,而 C++ 编译器的速度相当慢到目前为止,为缺少overrides 添加警告选项。

但我们正在到达那里; Clang 现在有 -Winconsistent-missing-override,而新的 GCC 有 -Wsuggest-override。您所要做的就是启用这些警告并将它们视为错误,无论是由编译器强制还是按照约定。

至于为什么不只是一个关键字:向后兼容旧代码。

【讨论】:

以上是关于为啥在 C++ 中覆盖是可选的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UITableViewCell textLabel 属性是可选的?

为啥在这种情况下 Array 的元素是可选的?

为啥 UITextField.text 是可选的?

为啥 C# 3.0 对象初始值设定项构造函数括号是可选的?

为啥我们在 sql 中需要一个可选的关键字 OUTER? [复制]

使用 'var' 声明变量是可选的吗? [复制]