为什么在成员声明之后出现覆盖而不是虚拟的相同位置?

Mor*_*hai 6 c++ c++11

我很好奇为什么新的C++ 11关键字override被强制出现在方法声明后以一致的方式const而不是virtual

class SomeBaseClass {
    virtual void DoPolymorphicBehavior() = 0;
    ...
class SomeDerrivedClass : public SomeBaseClass {
    void DoPolymorphicBehavior() override;
    ...
Run Code Online (Sandbox Code Playgroud)

为什么世界上不允许它处于相同的位置(甚至不是) virtual

class SomeBaseClass {
    virtual void DoPolymorphicBehavior() = 0;
    ...
class SomeDerrivedClass : public SomeBaseClass {
    override void DoPolymorphicBehavior();
    ...
Run Code Online (Sandbox Code Playgroud)

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

当然这个选择背后有充分的理由吗?

Jos*_*eld 10

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

override foo();
Run Code Online (Sandbox Code Playgroud)

甚至是一个名为的变量override:

int override;
Run Code Online (Sandbox Code Playgroud)

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

因此,他们不是引入新的关键字,而是引入了一个上下文关键字 :( override以及final).上下文关键字按其语法位置标识为关键字.它仍然是罚款,有所谓的标识符overridefinal在你的程序.如果这些标识符出现在函数声明中的参数列表之后,则它们具有特殊含义.

所以它放在函数参数之后的原因是因为引入新的关键字会破坏旧代码,如果编译器override在这里看到它们确切地知道它意味着什么,因为这里没有其他标识符出现.


CB *_*ley 7

它不是关键字,也是您问题的答案.

它是在某些上下文中具有特殊含义的标识符.如果允许它出现在声明的开头,那么它可能与用户定义的返回类型名称不明确.