为什么覆盖在 C++ 中是可选的?
Why is override optional in C++?
我理解 C++ override 的用途,但与其他默认需要使用它的高级语言相比,它的实现有点令人困惑。
C++11 wiki page 将其描述为 "technically identifier for declarator attribute" 但没有详细说明为什么它不仅仅是该语言的关键字。
保持与 C++03 的向后兼容性是可选的。使其成为非可选的会破坏所有代码*.
同样,将 override
作为关键字会破坏任何使用名称 override
.
的代码
好的,不是字面上的 所有 代码,而是很多代码。
从技术上讲,C++11 的行为与此处的 Java 没有太大区别(这是您提到的 "other higher level languages" 之一的典型示例)。 错误 override
将是一个编译错误,就像 Java 中错误的 @Override
一样。 A missing override
不会是编译错误,就像 Java.[=18= 中缺少 @Override
不会是编译错误一样]
我能看到的唯一真正区别是 Java 工具传统上更好地支持检测缺失 @Override
,并且传统上鼓励 Java 用户对待相应的警告为错误,而 C++ 编译器到目前为止在添加缺少 override
的警告选项方面相当缓慢。
但我们正在到达那里; Clang 现在有 -Winconsistent-missing-override
,较新的 GCC 有 -Wsuggest-override
。您所要做的就是启用这些警告并将它们视为错误,由编译器强制执行或仅按约定执行。
至于为什么它不是简单的关键字:与旧代码的向后兼容性。
我理解 C++ override 的用途,但与其他默认需要使用它的高级语言相比,它的实现有点令人困惑。
C++11 wiki page 将其描述为 "technically identifier for declarator attribute" 但没有详细说明为什么它不仅仅是该语言的关键字。
保持与 C++03 的向后兼容性是可选的。使其成为非可选的会破坏所有代码*.
同样,将 override
作为关键字会破坏任何使用名称 override
.
好的,不是字面上的 所有 代码,而是很多代码。
从技术上讲,C++11 的行为与此处的 Java 没有太大区别(这是您提到的 "other higher level languages" 之一的典型示例)。 错误 override
将是一个编译错误,就像 Java 中错误的 @Override
一样。 A missing override
不会是编译错误,就像 Java.[=18= 中缺少 @Override
不会是编译错误一样]
我能看到的唯一真正区别是 Java 工具传统上更好地支持检测缺失 @Override
,并且传统上鼓励 Java 用户对待相应的警告为错误,而 C++ 编译器到目前为止在添加缺少 override
的警告选项方面相当缓慢。
但我们正在到达那里; Clang 现在有 -Winconsistent-missing-override
,较新的 GCC 有 -Wsuggest-override
。您所要做的就是启用这些警告并将它们视为错误,由编译器强制执行或仅按约定执行。
至于为什么它不是简单的关键字:与旧代码的向后兼容性。