我刚刚发现C ++ / CLI在标准C ++上有一个不存在的关键字(AFAIK):override
。
我对C ++ / CLI了解不多,所以,有人可以解释它包含在哪个目的,以及它是否是添加到C ++中的理想功能?
答案 0 :(得分:12)
override
是Microsoft的特殊关键字扩展,可用于C ++ / CLI和Visual C ++实现。它类似于Java中的@Override
注释或C#中的override
,并提供更好的编译时间检查,以防您没有覆盖您想要的内容。
从第一个链接:
override表示托管类型的成员必须覆盖基类或基本接口成员。如果没有要覆盖的成员,编译器将生成错误。
编译本机目标(没有/ clr)时,override也有效。有关详细信息,请参阅覆盖说明符和本机编译。
override是一个上下文相关的关键字。有关详细信息,请参阅上下文相关关键字。
从C ++ 11标准开始,override
说明符现在是标准关键字。支持仍然有限,根据page from Apache StdCxx,override
支持GCC 4.7 +,Intel C ++ 12.0+和Visual C ++ 2012(在Visual C ++ 2005中支持预标准化)。
答案 1 :(得分:1)
它有助于编译器以两种方式解决您的错误:
如果在类中声明了一个带有override
的函数,但是基类没有该函数,那么编译器可以告诉您,您没有覆盖您认为的那个。如果override
不可用,则编译器将无法识别您的错误 - 它只是假设您打算引入新功能。
如果您的后代类中有一个函数(没有override
),然后在基类中声明与virtual相同的函数,编译器可以告诉您基类中的更改影响了后代原始声明的含义。后代将需要使用override
,或者您需要更改其中一个函数的签名。
此功能已添加到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.