为什么"覆盖/最终"需要放在函数声明符之后?

gez*_*eza 7 c++

我一直想知道决定,为什么overridefinal必须在成员函数声明符之后:

struct Base {
    virtual void virtFun();
};
struct Foo: Base {
    virtual void virtFun() override;
};
Run Code Online (Sandbox Code Playgroud)

对我来说,放置override/ final代替以下内容更合乎逻辑virtual:

struct Base {
    virtual void virtFun();
};
struct Foo: Base {
    override void virtFun();
};
Run Code Online (Sandbox Code Playgroud)

这背后有原因吗?也许与C++ 11之前有一些兼容性问题?

Som*_*ude 18

这是因为overridefinal不是关键词.

相反,它们是特殊标识符.

这意味着您实际上可以使用这些名称声明变量,函数或类型名称(类型别名或类).

它们只能在非常小的上下文中像成员函数修饰符一样使用,其中上下文必须由编译器在解析源时预先知道.在函数声明之后放置它们是从该上下文的C++语法中消除歧义的一种非常简单的方法.

  • 这意味着如果它们位于`virtual`的位置,你会遇到一些问题:`final myFunction();`是一个返回`final`数据类型的函数.至少,在该位置允许`final` /`override`会使语法复杂化,但可能会有歧义 (2认同)