C++ 虚函数的显式重写
我刚刚发现C++/CLI有一个在标准C++上不存在的关键字(AFAIK):C++ 虚函数的显式重写,c++,c++-cli,overriding,virtual-functions,C++,C++ Cli,Overriding,Virtual Functions,我刚刚发现C++/CLI有一个在标准C++上不存在的关键字(AFAIK):override 我对C++和CLI了解不多,所以有人能解释一下它包含了什么目的,如果它是一个需要添加到C++的特性? < p>是微软中的一个特殊的关键字扩展,可以用于C++和CLI和VisualC++实现。它类似于Java或C#中的注释,并提供更好的编译时检查,以防您没有覆盖您想要覆盖的内容 从第一个链接: 重写表示托管类型的成员必须重写基类或基接口成员。如果没有要重写的成员,编译器将生成一个错误 为本机目标(不带/cl
override
<>我对C++和CLI了解不多,所以有人能解释一下它包含了什么目的,如果它是一个需要添加到C++的特性? < p>是微软中的一个特殊的关键字扩展,可以用于C++和CLI和VisualC++实现。它类似于Java或C#中的注释,并提供更好的编译时检查,以防您没有覆盖您想要覆盖的内容
从第一个链接:
重写表示托管类型的成员必须重写基类或基接口成员。如果没有要重写的成员,编译器将生成一个错误
为本机目标(不带/clr)编译时,重写也有效。有关详细信息,请参阅重写说明符和本机编译
override是上下文敏感的关键字。有关更多信息,请参阅上下文相关关键字
从C++11标准开始,override
说明符现在是一个标准化的关键字。支持仍然是有限的,按照此,代码> >覆盖> /代码>由GCC 4.7 +、英特尔C++ 12 +和Visual C++ 2012支持(在Visual C++ 2005中预先标准化支持)。< P>:
如果在中标记属性或方法
具有virtual
关键字,从中派生类时
如果是,您可以忽略该方法或
属性,而不是实现它。但如果
您决定实现该属性
或方法,您必须指明
正在提供新版本的
属性或方法。提供新的
属性或方法的版本为
被称为覆盖它
重写属性或
方法,则必须通过
将覆盖
关键字写入其
对。
现在,按照查看一些示例。它有两种方法帮助编译器发现错误:
override
的函数,但基类没有该函数,那么编译器可以告诉您,您没有重写您认为是的函数。如果override
不可用,那么编译器将无法识别您的错误-它将简单地假设您打算引入一个新函数重写
),然后在基类中将该函数声明为virtual,编译器会告诉您基类中的更改已影响子类中原始声明的含义。子体需要使用覆盖
,或者您需要更改其中一个函数的签名此特性已被添加到C++ 0x中。
< p> C++中的重写关键字来自.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.
你没说你想的关键词是什么。是“明确的”吗?如果是这样,它是在标准C++中。@ Wes Hardaker实际上是我说的。这是“覆盖”关键字。这解释了覆盖关键字的机制。这并不能解释它为什么被引入。就像罗布的《第二集》一样,这不是真的。匹配基类中声明为虚拟的函数的签名足以重写函数,可以省略
override
关键字,并且函数仍将被重写。在不破坏大量现有代码的情况下,新关键字不能成为强制性的。我认为#2不是真的。您无需实际使用override
关键字,就可以很好地覆盖函数。如果这种情况发生变化,许多现有的代码将被破坏。