当前位置: 首页 > 知识库问答 >
问题:

“override”关键字只是对被覆盖的虚拟方法的检查吗?

仉昂熙
2023-03-14

据我所知,在C 11中引入<code>override</code>关键字只不过是一种检查,以确保正在实现的函数是基类中<code>虚拟</code>函数的<code>override</code>ing。

是这样吗?

共有3个答案

邹毅
2023-03-14

发现当有人更新基类虚方法签名时,“覆盖”是有用的,例如添加一个可选参数,但忘记更新派生类方法签名。在这种情况下,基类和派生类之间的方法不再是多态关系。如果没有覆盖声明,很难发现这种错误。

冯茂实
2023-03-14

维基百科引用:

重写特殊标识符意味着编译器将检查基类以查看是否存在具有此确切签名的虚拟函数。如果没有,编译器将出错。

http://en.wikipedia.org/wiki/C++11#Explicit_overrides_and_final

编辑(试图改进一点答案):

将方法声明为“重写”意味着该方法旨在重写基类上的(虚拟)方法。重写方法必须具有与它打算重写的方法相同的签名(至少对于输入参数)。

为什么有必要这样做?好吧,可以防止以下两种常见的错误情况:

>

  • 有人在新方法中打错了类型。编译器不知道它打算编写以前的方法,只是将其作为新方法添加到类中。问题是旧方法仍然存在,新方法只是作为一个重载添加。在这种情况下,所有对旧方法的调用都将像以前一样运行,而不会改变行为(这正是重写的目的)。

    人们忘记了将超类中的方法声明为“虚拟”,但仍然试图在子类中重写它。虽然这显然会被接受,但行为不会完全符合预期:该方法不是虚拟的,因此通过指向超类的指针进行访问将结束调用旧的(超类)方法而不是新的(子类)方法。

    添加“override”显然消除了这一点:通过这一点,我们告诉编译器有三件事是预期的:

    1. 在超类
    2. 中有一个同名的方法
    3. 超类中的这个方法被声明为“virtual”(这意味着要重写)
    4. 超类中的方法与子类(重写方法)中的方法具有相同的(输入*)签名

    如果其中任何一个为假,则发出错误信号。

    * 注意:输出参数有时是不同的,但相关的类型。如果有兴趣,请阅读协变和逆变变换

  • 樊浩初
    2023-03-14

    这确实是个主意。关键是你要明确自己的意思,这样就可以诊断出一个原本不存在的错误:

    struct Base
    {
        virtual int foo() const;
    };
    
    struct Derived : Base
    {
        virtual int foo()   // whoops!
        {
           // ...
        }
    };
    

    上面的代码可以编译,但并不是您的意思(请注意缺少的const)。如果你说,virtualintfoo()覆盖,那么你会得到一个编译器错误,你的函数实际上没有覆盖任何东西。

     类似资料:
    • 在过去的几周里,有一些关于< code>virtual和< code>override的事情困扰着我的大脑。我了解到,当你用虚函数做继承时,你必须添加< code>virtual来让编译器知道搜索正确的函数。后来我还了解到在c 11中有一个新的关键字- 。现在我有点迷茫;我需要在程序中同时使用虚拟关键字和重写关键字吗,或者最好只使用其中一个? 解释我自己-我的意思的代码示例: 最好的方法是什么?

    • C++中的面向对象的变成都是围绕类,继承和虚函数进行的。其中最基础的一部分就是,派生类中的虚函数会覆盖掉基类中对应的虚函数。但是令人心痛的意识到虚函数重载是如此容易搞错。这部分的语言特性甚至看上去是按照墨菲准则设计的,它不需要被遵从,但是要被膜拜。 因为覆盖“overriding”听上去像重载“overloading”,但是它们完全没有关系,我们要有一个清晰地认识,虚函数(覆盖的函数)可以通过基类

    • 链接的问题不一样 - 甚至没有提到 编辑:新的副本列表包含一个合法的副本,我在搜索中没有找到。 在问这个问题之前,我不知道是否在派生类成员中使用的选择对某些人来说将是一个有争议的问题。 我刚刚遇到了一些如下所示的源代码: 我不确定如何解释这个,甚至在读完这个之后。 这里的< code>override是指< code>virtual吗?< code>void B::method()未被标记为虚函数

    • 在C语言中对一个函数同时使用< code>virtual和< code>override有危险吗?这会让你对重载产生歧义吗? 显然,必须在基类中使用,在派生类中不使用是很愚蠢的,但在派生类中将与一起使用实际上有问题吗? 试图确定这是一个风格还是正确性的问题。 例子:

    • 本文向大家介绍请说明”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?相关面试题,主要包含被问及请说明”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?时的应答技巧和注意事项,需要的朋友参考一下 考察点:static变量 “static”关键字表明一个成员变量

    • 是否真的有必要使用或? 我知道在这个总的话题上有很多问题,例如: 派生类中函数的“virtual”关键字。有必要吗? < Li >“override”关键字是否只是对被重写的虚方法的检查? < li >虚拟?覆盖?还是两者都有?C 从这些和其他标记为重复项的内容中(许多“重复项”的答案都包含至少对我来说是新的不同信息),我学到了一些东西(我认为,大致为什么它们是真的):没有虚拟的覆盖不会编译。没有