对使用'typedef'声明的函数使用'override'

Glo*_*tre 16 c++ language-lawyer c++11 c++14

C++ 11为函数引入了'override'说明符,我发现它很有用,因为它明确表示正在覆盖虚函数.但是,我似乎无法使用typedef声明的函数.

我知道'覆盖'不是关键字,它与它有关吗?

以下代码说明了我的观点:

#include <iostream>

typedef char ReturnsChar();

class Basic
{
    public:
    virtual char get_a();
    virtual ReturnsChar get_z;
};

char Basic::get_a() { return 'a'; }
char Basic::get_z() { return 'z'; }

class Capitalized : public Basic
{
    public:
    // Can override explicitly if I use the normal definition
    char get_a() override;

    // Compiles if I use the typedef but not 'override'
    ReturnsChar get_z;

    // Will not compile, but would like to do this
    //ReturnsChar get_z override; 

};

char Capitalized::get_a() { return 'A'; }
char Capitalized::get_z() { return 'Z'; }

int main()
{
    Basic foo;
    Capitalized bar;

    std::cout << foo.get_a() << std::endl; // a
    std::cout << foo.get_z() << std::endl; // z
    std::cout << bar.get_a() << std::endl; // A
    std::cout << bar.get_z() << std::endl; // Z
}
Run Code Online (Sandbox Code Playgroud)

我正在使用GNU的g ++ 8.2.0,它给我的错误是

error: expected ';' at end of member declaration
ReturnsChar get_z override;
            ^~~~~
                      ;
error: ‘override’ does not name a type; did you mean ‘ctermid’?
     ReturnsChar get_z override;
                       ^~~~~~~~
                       ctermid
Run Code Online (Sandbox Code Playgroud)

编辑:为了解决这些评论,我理解这种风格尚不清楚.我更感兴趣的是为什么这不会编译以及'覆盖'究竟是什么(特别是因为它不是关键字).顺便说一句,我觉得在某些情况下类型定义函数可能很清楚,比如说:

void (*foo(int x, void (*f)(int)))(int);
Run Code Online (Sandbox Code Playgroud)

这很难读,特别是如果经常出现的话.我可以只输入def作为'UpdateAddressFunction',然后在心理上将这种类型的每个函数都想象成'更新地址'.

小智 23

我知道'覆盖'不是关键字,它与它有关吗?

它确实:override仅在少数特定情况下被识别,并且作为普通用途的名称可用.但是,我认为这是一个编译器错误,这是编译器应该以其特殊含义识别它的一个上下文.

相关的语法生产是这样的

[class.mem]

member-declarator:
  declarator virt-specifier-seq opt pure-specifier opt

这不要求virt-specifier-seq仅出现在包含参数的声明中.唯一类似的要求如下:

[class.mem] P8:

的virt说明符-SEQ应仅在一个虚拟的成员函数(10.3)的声明出现.

在您的情况下,声明是虚拟成员函数之一.我相信override应该在这里接受.