aia*_*iao 210 c++ inheritance overriding virtual-functions c++11
据我所知,override在C++ 11中引入关键字只不过是一个检查,以确保正在实现override的virtual函数是基类中的函数.
是吗?
Ker*_* SB 241
这确实是个主意.关键是你明确你的意思,以便可以诊断出一个无声的错误:
struct Base
{
virtual int foo() const;
};
struct Derived : Base
{
virtual int foo() // whoops!
{
// ...
}
};
Run Code Online (Sandbox Code Playgroud)
上面的代码编译,但不是你的意思(注意缺少const).如果你反而说virtual int foo() override,那么你会得到一个编译错误,你的函数实际上并没有覆盖任何东西.
use*_*631 33
维基百科报价:
覆盖特殊标识符意味着编译器将检查基类以查看是否存在具有此确切签名的虚函数.如果没有,编译器将会出错.
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
编辑(试图提高答案):
将方法声明为"覆盖"意味着该方法旨在重写基类上的(虚拟)方法.重写方法必须具有与要重写的方法相同的签名(至少对于输入参数).
为什么这有必要?好吧,以下两个常见错误案例被阻止:
一个错误输入新方法中的类型.编译器不知道它打算编写前一个方法,只是将它作为新方法添加到类中.问题是旧方法仍然存在,新方法只是作为重载添加.在这种情况下,对旧方法的所有调用都将像以前一样运行,而不会改变行为(这将是重写的目的).
一个忘记将超类中的方法声明为"虚拟",但仍尝试在子类中重写它.虽然这显然会被接受,但行为并不完全符合预期:该方法不是虚拟的,因此通过指向超类的指针访问将结束调用旧(超类')方法而不是新(子类')方法.
添加"覆盖"清楚地消除了歧义:通过这个,人们告诉编译器有三件事需要:
如果其中任何一个为假,则发出错误信号.
*注意:输出参数有时不同,但相关类型.如果感兴趣,请阅读有关协变和逆变换的信息.
是的,就是这样.这是一个检查,以确保一个人不会尝试覆盖并通过一个拙劣的签名弄乱它.这是一个维基页面,详细解释了这一点,并有一个简短的说明性示例:
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final