6

我很好奇为什么新的 C++11 关键字被迫以与而不是override一致的方式出现在方法声明之后?constvirtual

class SomeBaseClass {
    virtual void DoPolymorphicBehavior() = 0;
    ...
class SomeDerrivedClass : public SomeBaseClass {
    void DoPolymorphicBehavior() override;
    ...

为什么在世界上不允许它在相同的确切位置(甚至代替)virtual

class SomeBaseClass {
    virtual void DoPolymorphicBehavior() = 0;
    ...
class SomeDerrivedClass : public SomeBaseClass {
    override void DoPolymorphicBehavior();
    ...

这将允许我在我的源文件中对派生类进行搜索和替换,以轻松地使用 new 关键字,从而在查找错误时从编译器获得帮助。但是,由于 C++11 在语法上将其置于不同的位置,因此我必须手动更新数千行源代码才能从新的编译器功能中获得任何好处。

这个选择背后肯定有充分的理由吗?

4

3 回答 3

10

出现在函数名之前的声明说明符序列可以包含一个标识符(例如,函数的返回类型)。想象一些现有代码的返回类型为override

override foo();

甚至是一个名为的变量override

int override;

引入一个新的关键字override会破坏任何现有的代码,这些代码包含一个名为的标识符,override因为关键字是保留的。

因此,他们没有引入新的关键字,而是引入了上下文关键字:(override以及final)。上下文关键字通过其句法位置标识为关键字。override在程序中调用标识符仍然可以final。如果这些标识符出现在函数声明中的参数列表之后,则它们具有特殊含义。

所以将它放在函数参数之后的原因是因为引入新关键字会破坏旧代码,如果编译器看到override这里,他们就会确切地知道它的含义,因为这里不会出现其他标识符。

于 2013-02-27T18:43:56.183 回答
7

It's not a keyword and that is the answer to your question as well.

It is an identifier with a special meaning in some contexts. If it were allowed to appear at the start of the declaration it could be ambiguous with, say, a user defined return type name.

于 2013-02-27T18:34:57.117 回答
2

因为overrideandfinal不是关键字,而是符号,可以出现在用户代码中。(即您可以有一个变量 int override;。)它们仅在有限的上下文中具有其特定含义,并且必须选择这些上下文以对应于用户定义的符号不能出现的上下文。也希望立即说明这一点;在这种情况下:

override void DoSomething();

,override不能是用户符号,因为没有语法产生式可以有一个以用户定义符号开头的语句,后跟void. 但是在编译器遇到 之前,这个问题并不清楚void,如果 void你有一个用户定义的类型而不是 ,它就更加模棱两可了。另一方面,在函数的参数声明子句之后,上下文是明确的,编译器的扫描器立即知道要做什么。

于 2013-02-27T18:47:13.580 回答