显式覆盖虚函数

时间:2011-01-28 19:42:33

标签: c++ c++-cli override virtual-functions

我刚刚发现C ++ / CLI在标准C ++上有一个不存在的关键字(AFAIK):override

我对C ++ / CLI了解不多,所以,有人可以解释它包含在哪个目的,以及它是否是添加到C ++中的理想功能?

4 个答案:

答案 0 :(得分:12)

override是Microsoft的特殊关键字扩展,可用于C ++ / CLI和Visual C ++实现。它类似于Java中的@Override注释或C#中的override,并提供更好的编译时间检查,以防您没有覆盖您想要的内容。

从第一个链接:

  

override表示托管类型的成员必须覆盖基类或基本接口成员。如果没有要覆盖的成员,编译器将生成错误。

     编译本机目标(没有/ clr)时,

override也有效。有关详细信息,请参阅覆盖说明符和本机编译。

     

override是一个上下文相关的关键字。有关详细信息,请参阅上下文相关关键字。

从C ++ 11标准开始,override说明符现在是标准关键字。支持仍然有限,根据page from Apache StdCxxoverride支持GCC 4.7 +,Intel C ++ 12.0+和Visual C ++ 2012(在Visual C ++ 2005中支持预标准化)。

答案 1 :(得分:1)

它有助于编译器以两种方式解决您的错误:

  1. 如果在类中声明了一个带有override的函数,但是基类没有该函数,那么编译器可以告诉您,您没有覆盖您认为的那个。如果override不可用,则编译器将无法识别您的错误 - 它只是假设您打算引入新功能。

  2. 如果您的后代类中有一个函数(没有override),然后在基类中声明与virtual相同的函数,编译器可以告诉您基类中的更改影响了后代原始声明的含义。后代将需要使用override,或者您需要更改其中一个函数的签名。

  3. 此功能已添加到C ++ 0x中。

答案 2 :(得分:0)

来自here

  

如果您在中标记属性或方法   virtual的父类   从中派生类时的关键字   它,你可以忽略该方法或   财产,而不是实现它。但如果   你决定实施该财产   或方法,你必须表明你   正在提供新版本的   财产或方法。提供新的   属性或方法的版本是   被称为压倒它。

     

覆盖房产或房产时   方法,你必须通过   将override关键字写入其中   右。

现在请点击link查看一些示例。

答案 3 :(得分:0)

C ++ / CLI中的override关键字来自.Net,而不是C ++本身的一部分。由于已经解释了覆盖,您需要知道替代方案。如果你没有“覆盖”它,你可能想让它“新”。通过使其成为“新”,您不会覆盖子类中的父类成员,而是创建具有相同名称的新成员。只有在使用基类指针并将其指向派生类对象时,new和override关键字才会有所不同。

因此,如果您使用基类指针并指向派生类对象:

If you call an "override"n member:
      the derived class member is called
if you call the "new"ed member:
      the base class member is called.