C++11引入了“override”关键字用于函数,我觉得很有用,因为它明确表示虚函数正在被重写。但是,对于使用typedef声明的函数,似乎无法让它起作用。
我知道“override”不是一个关键字,这与它有关吗?
以下代码说明了我的观点:
#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
}
我正在使用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
编辑:针对评论,我知道这种风格不清晰。我更关心的是为什么这个代码无法编译,以及'override'到底做了什么(特别是它不是一个关键字)。此外,我觉得在某些情况下,为函数定义typedef可能会更清晰,比如:
void (*foo(int x, void (*f)(int)))(int);
那很难读,尤其是经常出现。我可以把它typedef为“UpdateAddressFunction”,然后在脑海中将该类型的每个函数视为“更新地址”的内容。
typedef
使用。这使得在类内不清楚get_z
是一个方法而不是变量。 - Cory Kramer