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,它给我的错误是
Run Code Online (Sandbox Code Playgroud)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
编辑:为了解决这些评论,我理解这种风格尚不清楚.我更感兴趣的是为什么这不会编译以及'覆盖'究竟是什么(特别是因为它不是关键字).顺便说一句,我觉得在某些情况下类型定义函数可能很清楚,比如说:
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应该在这里接受.