【发布时间】:2017-11-02 22:18:38
【问题描述】:
我一直想知道这个决定,为什么 override 和 final 必须在成员函数声明符之后:
struct Base {
virtual void virtFun();
};
struct Foo: Base {
virtual void virtFun() override;
};
对我来说,用override/final 代替virtual 会更合乎逻辑:
struct Base {
virtual void virtFun();
};
struct Foo: Base {
override void virtFun();
};
这背后有什么原因吗?可能是 C++11 之前的兼容性问题?
【问题讨论】:
-
你也可以写
virtual void virtFun() override -
鉴于“覆盖”是一个新关键字,我想不出任何技术原因。谁想到了“覆盖”关键字,就完全武断地决定了它的归属。没有什么特别的原因。
-
与Why are override and final identifiers with special meaning instead of reserved keywords?密切相关...
override and final end up being used in the grammar in places where no user identifiers can appear. So in those places the identifiers can have a special meaning and outside of those contexts they can be treated as a regular identifier leaving the identifiers available for users. -
@ShafikYaghmour tl;dr;就像 op 猜测的那样,保持与 C++11 前代码的兼容性基本上是一种诡计。因此,语言语法变得比以前更加一致。我认为更好的想法是要求编译器在某些标识符和“指定”之间的名称冲突时发出警告作为第一步,然后将这些“说明符”作为适当的保留关键字。
-
一个体面的术语是“上下文关键字”,它只有在出现在正确的位置时才有意义。并且编译器只有在对语句的上下文足够了解时才会对其进行特殊处理。将它放在语句的末尾会有所不同,解析器已经非常清楚您正在编写函数声明,因此不需要关键字提供的那种帮助。与经历相同演变的Java相比,他们必须写
@Override。 @ 很丑,但确实允许它出现在声明的开头。
标签: c++