“覆盖”关键字只是检查重写的虚拟方法吗?

据我所知,在C ++ 11中引入override关键字只不过是一个检查,以确保正在实现的function是在基类中的virtual函数的override

是吗?

这确实是这个想法。 重点是,你明确你的意思,以便可以诊断一个否则沉默的错误:

 struct Base { virtual int foo() const; }; struct Derived : Base { virtual int foo() // whoops! { // ... } }; 

上面的代码编译,但不是你可能的意思(注意缺less的const )。 如果你说,而是virtual int foo() override ,那么你会得到一个编译器错误,你的函数实际上并不重写任何东西。

维基百科的报价:

覆盖特殊标识符意味着编译器将检查基类以查看是否存在具有该确切签名的虚函数。 如果没有,编译器将会出错。

http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final

编辑(尝试改善一点答案):

将方法声明为“覆盖”意味着该方法旨在重写基类上的(虚拟)方法。 重写方法必须和它打算重写的方法一样具有相同的签名(至less对于input参数)。

为什么这是必要的? 那么,以下两种常见的错误情况是被阻止的:

  1. 在新方法中错误地input一个types。 编译器不知道它打算写一个以前的方法,只是把它作为一个新的方法添加到类中。 问题是旧的方法仍然存在,新的方法只是作为一个超负荷添加。 在这种情况下,所有对旧方法的调用都将像以前一样运行,而不会改变行为(这将是重写的目的)。

  2. 人们忘记将超类中的方法声明为“虚拟”,但仍尝试将其重写在子类中。 虽然这将明显被接受,但行为不会是完全符合预期的:方法不是虚拟的,所以通过指向超类的指针访问将结束调用旧(超类)方法而不是新(子类)方法。

添加“覆盖”明确地消除了这一点:通过这个,告诉编译器有三件事情是期待的:

  1. 在超类中有一个同名的方法
  2. 超类中的这个方法被声明为“虚拟的”(意思是打算被重写)
  3. 超类中的方法与子类中的方法(重写方法)具有相同的(input*)签名,

如果其中任何一个是错误的,那么就会发出错误信号。

*注意:输出参数有时是不同的,但是相关的types。 如果感兴趣,请阅读关于协变和逆变的转换。

当有人更新了基类虚拟方法签名(如添加可选参数,但忘记更新派生类方法签名)时,发现“ 覆盖 ”是有用的。 在这种情况下,基类和派生类之间的方法不再是多态关系。 没有覆盖声明,很难找出这种错误。

是的,这是如此。 这是一个检查,以确保一个不会尝试重写,并通过一个拙劣的签名搞砸了。 这是一个Wiki页面,详细解释了这个页面,并且有一个简短的说明示例:

http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final