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

在 C 11 中同时使用虚拟关键字和覆盖关键字有什么微妙之处吗?

邢献
2023-03-14

在C语言中对一个函数同时使用< code>virtual和< code>override有危险吗?这会让你对重载产生歧义吗?

显然,virtual必须在基类中使用,在派生类中不使用override是很愚蠢的,但在派生类中将virtualoverride一起使用实际上有问题吗?

试图确定这是一个风格还是正确性的问题。

例子:

class Widget {
  virtual void transmogrify() = 0;
}

class Gadget : public Widget {
  virtual void transmogrify() override {}
}

共有3个答案

澹台建华
2023-03-14

在您的示例中,您说的是关于 Gadget 方法转换的两件不同但重要的事情

virtual-如果一个类派生自Gadget,则派生类会将transmogrify函数视为虚拟

覆盖-Gadget类正在显式覆盖基类WidgetTransmogrfy版本。

这两部关键作品是正交的,互不影响。override 关键字的好处是它向编译器声明您正在尝试重写继承的虚拟函数。如果您在基类上匹配函数的函数签名时出错,则它不会编译,因为如果声明为覆盖,它必须覆盖继承的函数

农诚
2023-03-14

比赛开始较晚,但本C核心指南似乎与此相关:

原因

可读性。错误的检测。编写显式虚拟覆盖最终是自文档化的,使编译器能够捕捉基类和派生类之间类型和/或名称的不匹配。然而,编写这三个中的一个以上既是多余的,也是潜在的错误来源。

这很简单明了:

    < li> virtual的确切含义是“这是一个新的虚函数” < li> 覆盖的确切含义是“这是一个非最终覆盖” < li> final的确切含义是“这是最终否决”
岳劲
2023-03-14

重写时,虚拟关键字无效。与基类中定义的虚函数签名匹配的派生函数将重写基本定义,并且重写将在vtable中输入,无论派生类中是否使用了虚拟关键字。

因为如果不进行重写,< code>override关键字会导致编译错误,所以组合使用< code>virtual关键字是没有用的。

在这里,有一个备忘单:

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

  • 问题内容: 今天的工作中,我遇到了volatileJava中的关键字。不太熟悉,我找到了这种解释。 鉴于该文章详细解释了所讨论的关键字,您是否曾经使用过它,或者是否曾见过可以正确使用此关键字的情况? 问题答案: volatile具有内存可见性的语义。基本上,volatile字段的值对所有读取器(尤其是其他线程)可见,在该字段上完成写操作之后。没有volatile,读者可能会看到一些未更新的值。 要

  • 问题内容: 我找不到有关该关键字的文档,但在网上看到了使用该关键字的示例。 我正在Oracle模式下进行一些实验,其中有table : 一张表: 和表: 查询应返回部门名称,部门经理的名字和部门所在的城市。 与使用关键字相比,使用关键字的代码似乎返回了一些结果 的代码: 的代码: 两种情况之间是否有区别,还是我偶然发现它们返回相同结果的情况? 问题答案: 根据1992 ANSI SQL参考,INN

  • 本文向大家介绍此关键字在Java中有什么用?,包括了此关键字在Java中有什么用?的使用技巧和注意事项,需要的朋友参考一下 Java中的“ this”关键字是对当前类对象的引用。使用它,您可以引用类的字段,方法或构造函数。 使用“ this”关键字引用字段 如前 ,您可以使用“ this” 关键字从实例方法或构造函数中引用类的实例字段/变量。  即如果一个方法的名称相同的实例变量一个局部变量的话,

  • 问题内容: 我正在网上关注Java教程,尝试学习该语言,并且它在使用数组的两种语义之间反弹。 和: 该教程从未真正提到过为什么它会在两者之间来回切换,所以我对该主题进行了一些搜索。我目前的理解是,操作员正在创建“ longs数组”类型的对象。我 不 明白的是为什么我要那个,那有什么后果? 是否存在某些特定于“数组”的方法,除非它是“数组对象”,否则这些方法对数组不起作用? 有什么我 不能 用普通数

  • 问题内容: 怎么办?例如在函数中: 问题答案: 如果使用(或-ea简称)启动程序,则此语句 相当于 如果不使用此选项启动程序,则assert语句将无效。 例如,;在你的问题中发布的,等同于 (如果你启动的是。) Java语言规范assert正式为:14.10。该声明说: 14.10。的声明 的断言是一个含有一个布尔表达式语句。断言是启用还是禁用。如果启用了断言,则断言的执行将导致对布尔表达式进行求