override
。我不太了解C++/CLI,请问有人能解释一下它的目的是什么,以及是否应该将其作为C++的一个可取特性添加进去?
override
。override
是来自于微软的专门用于 C++/CLI 和 Visual C++ 实现的一个特殊关键字扩展。它类似于 Java 中的 @Override
注解或者 C# 中的 override
,并且提供了更好的编译时检查机制,以防您没有正确覆盖您想要覆盖的内容。
来自第一个链接:
override 表示托管类型的成员必须覆盖基类或者基接口中的成员。如果没有成员需要覆盖,编译器会生成一个错误。
在编译为本机目标(不带 /clr)时,override 也是有效的。更多信息请参见 Override Specifiers and Native Compilations。
override 是一种上下文敏感的关键字。更多信息请参见 Context-Sensitive Keywords。
从 C++11 标准开始,override
说明符现在成为了一个标准化的关键字。然而,支持仍然有限。根据这个来自 Apache StdCxx 的页面,GCC 4.7+、Intel C++ 12.0+ 和 Visual C++ 2012(在 Visual C++ 2005 中具有预标准化支持)都支持 override
。
它有两种方式帮助编译器捕获您的错误:
如果您在类中使用override
声明函数,但是基类没有该函数,则编译器可以告诉您您没有覆盖您认为的内容。如果没有override
,则编译器将无法识别您的错误 - 它只会假定您打算引入一个新函数。
如果您在派生类中有一个函数(没有override
),然后在基类中将同一函数声明为虚函数,则编译器可以告诉您基类中的更改已经影响了派生类中原始声明的含义。派生类将需要使用override
,或者您需要更改其中一个函数的签名。
这个特性已经被添加到C++0x中了。
C++/CLI 中的 override 关键字来自 .Net 而不是 C++ 本身。由于已经解释了 override,您需要知道替代方案。如果您不“override”它,则可能希望将其“new”。通过将其“new”,您不会在子类中覆盖父类成员,而是创建一个具有相同名称的新成员。当您使用基类指针并将其指向派生类对象时,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.
override
关键字可以省略,函数仍然会被覆盖。新的关键字不能强制成为必需品,否则将破坏大量现有代码。 - Ben Voigt