【发布时间】:2018-08-31 11:24:47
【问题描述】:
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
}
我正在使用 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
编辑:为了解决 cmets,我理解这种风格尚不清楚。我更感兴趣的是为什么这不会编译以及“覆盖”到底是做什么的(特别是因为它不是关键字)。 顺便说一句,我觉得 typedef-ing 函数在某些情况下可能很清楚,比如:
void (*foo(int x, void (*f)(int)))(int);
这很难阅读,尤其是经常出现时。我可以将其键入定义为“UpdateAddressFunction”,然后在脑海中将该类型的每个函数都视为“更新地址”。
【问题讨论】:
-
typedef的使用确实令人困惑/不好。这使得在类中很不清楚get_z是一个方法而不是一个变量。 -
^ 完全同意这一点。如果您添加语言律师标签,有人可能会判断这是否符合标准,但我不想看到接受此的代码审查:P
-
是的,在这个例子中我完全同意。但是,在我的实际用例中,我使用了一些非常复杂的函数原型和函数指针,这使得函数的类型定义很有用(我喜欢这样想)。无论哪种方式,我的问题的目的更多是为了理解为什么它不会编译,而不是样式。
-
为什么不 typedef 只返回类型?这还不够吗?
-
@user463035818 另一个错误。 virt-specifier 甚至不允许出现在常规声明的语法中,只能出现在类中的 member-declaration 中。
标签: c++ c++11 c++14 language-lawyer