据我了解,在C ++ 11引进override
关键字的无非是更多的检查,以确保正在实施的功能是在基类override
功能的virtual
ing。
是不是这样?
这是确实的想法。问题的关键是,你明确你的意思,让原本沉默的错误可以诊断:
struct Base
{
virtual int foo() const;
};
struct Derived : Base
{
virtual int foo() // whoops!
{
// ...
}
};
上面的代码编译,但不是你的意思是不是(注意失踪const
)。如果你不是说,virtual int foo() override
,那么你会得到一个编译错误,你的功能其实也不是什么压倒一切。
维基百科报价:
超驰特殊标识符意味着,编译器将检查基类(ES),以查看是否存在与此完全相同的签名的虚函数。如果没有,编译器会报错了。
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
编辑(试图改善了一下回答):
声明一个方法为“覆盖”是指该方法的目的是重写在基类(虚拟)方法。压倒一切的方法必须具有相同的签名(至少对于输入参数),因为它打算重写方法。
为什么是这个必要吗?好了,则无法进行以下两种常见的错误情况:
添加“越权”显然这个歧义消除:通过这个,一个是告知三件事期待的编译:
如果其中任何一个为假,则发出错误信号。
*注:输出参数有时是不同的,但相关的类型。阅读关于如果有兴趣的协变和逆变转换。
发现“覆盖”是当有人更新基类的虚方法签名如添加一个可选参数,但忘了更新派生类的方法签名是有用的。在这种情况下,基部和派生类之间的方法不再多态的关系。如果没有重写声明,这是很难找出这种错误。
是的,这是如此。这是一个检查,以确保一个不试图通过一个拙劣的签名的倍率,搞砸了。下面是说明对此进行了详细和有一个很短说明性的例子一个Wiki页面:
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
C ++ 17标准草案
在override
去在所有C++17 N4659 standard draft命中之后,仅供参考我能找到的override
标识符是:
5如果一个虚拟函数标有VIRT说明符倍率和不覆盖的基类的成员函数,是形成不良的节目。 [实施例:
struct B { virtual void f(int); }; struct D : B { virtual void f(long) override; // error: wrong signature overriding B::f virtual void f(int) override; // OK }
- 端示例]
所以我认为可能吹错了程序实际上是唯一的影响。