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

C覆盖说明符没有虚拟?覆盖是否意味着虚拟?[重复]

施辉
2023-03-14

链接的问题不一样 - 甚至没有提到覆盖

编辑:新的副本列表包含一个合法的副本,我在搜索中没有找到。

在问这个问题之前,我不知道是否在派生类成员中使用虚拟的选择对某些人来说将是一个有争议的问题。

我刚刚遇到了一些如下所示的源代码

class A
{
    virtual void method();
};

class B : public A
{
    void method() override;
}

我不确定如何解释这个,甚至在读完这个之后。

这里的< code>override是指< code>virtual吗?< code>void B::method()未被标记为虚函数,但被标记为< code>override。那么,为什么这样做有效,并且不会导致编译错误呢?

以下两者有什么区别吗?(在B类中)

  • void method() override;
  • 虚拟无效方法() 覆盖;

共有3个答案

敖涵容
2023-03-14

是的,重写意味着虚拟,因为如果函数尚未在基类中声明为 virtual,则重写将是一个错误(并由编译器诊断错误),并且将 virtual 和 override 添加到同一函数是多余的(就像在派生类中添加 virtual 关键字是多余的一样 - 基类虚拟的函数始终是虚拟的在派生类中,即使没有显式标记为这样)。但是,这也意味着覆盖不会使函数成为虚拟函数(如果它还没有的话)。

您显示的代码非常合理。它清楚地传达了(通过覆盖关键字)该函数是虚拟,并且覆盖是基类中的虚拟函数(所有这些都只有一个关键字)。

匡祖鹤
2023-03-14

覆盖是否意味着这里是虚拟的?

对只能重写虚拟方法<非虚拟方法上的code>override是一个错误。

< code>void B::method()未标记为虚函数,[..]

在基类中将方法声明为虚拟就足够了。在从 A 派生的所有类中,该方法都是虚拟的。将虚拟说明符添加到 B::方法 将是多余的。

以下两者有什么区别吗?[...]

在派生类中也提到方法是虚拟对易读性有好处。尽管,由于只能覆盖虚拟方法,指定覆盖就足够了,以明确它是一个虚拟方法。

麹飞航
2023-03-14

你要找的答案是https://en.cppreference.com/w/cpp/language/virtual

如果某个成员函数 vf 在类 Base 中声明为虚拟,并且某个类派生(直接或间接从 Base 派生)具有具有相同名称的成员函数的声明 参数类型列表(但不是返回类型) cv-限定符 ref-qualifier 则类 Derived 中的这个函数也是虚拟的(无论在其声明中使用关键字 virtual )并覆盖 Base::VF(无论在其声明中是否使用单词覆盖)。

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

  • 据我所知,<code>override</code>关键字声明给定的声明实现了一个基本<code>virtual</code>方法,如果没有找到匹配的基本方法,编译应该失败。 我对< code>final关键字的理解是,它告诉编译器任何类都不能覆盖这个< code >虚拟函数。 那么是多余的吗?它似乎编译得很好。最终传达哪些信息而信息不传达?这种组合的用例是什么?

  • 在C 11之前,当在派生类中重写虚拟函数时,建议将虚拟关键字也添加到派生类函数中,以明确其意图。 如今,这样的函数被标记为“override ”,这包含了必须有一个虚基类函数的概念。因此,我现在宁愿省略虚拟的: 然而,这会导致MSVC 2012中的IntelliSense错误:“覆盖”修饰符需要带有显式“虚拟”关键字的虚函数声明 显然编译器编译了类,但错误让我想到了它。是否仍有正当理由添加虚拟关键

  • 我想知道为什么我们不应该重写非虚拟函数?

  • 我把另一个项目放在我的主项目中,这个项目叫做OAuthSwift,它包含了一个框架。当我试图构建它时,我得到了这个错误: :0:错误:无效的虚拟文件系统覆盖文件“/users/gabrieljones/library/developer/xcode/deriveddata/paul”的_console-bbbxnfmomaaurfeabxmnchoqmwpa/build/intermediates

  • 我对虚拟函数感到困惑。有人告诉我,父类中的虚拟意味着我可以在子类中覆盖它。但是,如果我省略父类中的虚拟,我仍然可以覆盖它。