C++ 虚函数的显式重写

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

我刚刚发现C++/CLI有一个在标准C++上不存在的关键字(AFAIK):
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
    关键字,就可以很好地覆盖函数。如果这种情况发生变化,许多现有的代码将被破坏。