我试图了解为什么在C++11中,他们必须在方法的末尾添加override关键字,而不是像virtual这样的开头。我认为不能在方法的声明中同时编写virtual和override。
委员会为什么不选择在需要时编写override而不是virtual,有什么技术原因吗?
谢谢!
发布于 2015-01-27 04:27:09
关于添加关键字控制覆盖(override/final)的建议,即纸张N3151,给我们提供了一些关于这一选择的见解(重点是我的):
最好将这样的虚拟控制关键字放在声明的末尾,这样它们就不会与eg发生冲突。在声明开始时返回类型。 ..。 对于上下文不敏感的普通关键字,因为单词是保留的,所以关键字放在哪里就不那么重要了。我们可以把它们放在宣言的开头或结尾。 在讨论属性时,Francis指出,声明的开始变得越来越拥挤。如果我们将虚拟控制关键字放在开头,我们可以得到下面这样的示例:
struct B
{
virtual volatile const unsigned long int f()
volatile const noexcept;
void f(int g);
};
struct D : B
{
virtual hides_name virtual_override final_overrider volatile const unsigned long int f()
volatile const noexcept;
};将新关键字放在末尾至少在一定程度上缓解了这种情况:
struct B
{
virtual volatile const unsigned long int f()
volatile const noexcept;
void f(int g);
};
struct D : B
{
virtual volatile const unsigned long int f()
hides_name virtual_override final_overrider volatile const noexcept;
};有些人认为这些控制关键字应该与虚拟的位置相同。如前所述,那个地方已经很拥挤了。
注:
C++ 11标准在§2.11 /2 lex.name中定义了上下文敏感的关键字:
表3中的标识符在特定的上下文中具有特殊的含义。在语法中引用这些标识符时,将显式地使用这些标识符,而不是使用标识符语法生成。除非另有规定,对于给定的标识符是否具有特殊含义的任何歧义都被解析为将令牌解释为常规标识符。 Table3: 最终覆盖
发布于 2015-01-27 08:17:14
这当然是有技术原因的!您可以在这篇文章中阅读有关它的所有内容。
简单地说,override是一个上下文敏感的关键字,这意味着您也可以使用它作为标识符。这样做是为了避免破坏使用此标识符的现有代码。这意味着它必须出现在不允许标识符的位置,即在函数声明的结束括号之后立即出现。
https://stackoverflow.com/questions/28163187
复制相似问题