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

当使用“override”或“final”说明符时,“virtual”关键字是不是多余的?

鲍鸿波
2023-03-14

假设我有以下基类:

class Base {
    public:
        virtual void f() {};
};

如果我想编写一个类,它将覆盖< code>f()并且不允许覆盖它的派生类,可以使用以下方法编写它:

方法一:

class Derived : public Base {
    public:
        virtual void f() override final {};
};

方法2:

class Derived : public Base {
    public:
        void f() final {};
};

< code >方法1非常详细,而< code >方法2更加紧凑,并且< code>final仍然表示< code>f()实际上是虚拟的,并且覆盖了基类方法。

哪一种方法更合适?

共有3个答案

公孙芷阳
2023-03-14

这是非常过时的,因为C11已经广泛可用,但作为C11的早期采用者,我使用#defines来覆盖和最终将我的代码移植到C03和更早版本。

我怀疑这在任何现代平台上都是必须的,但你永远不会知道。

我仍然发现覆盖和虚拟关键字不在同一侧,这在美学上是令人痛苦的。

这个问答比现在的更好参考。

邵飞鸿
2023-03-14
class Derived : public Base {
public:
    void f() override final {};
};

也许那样<在派生类中不需要code>virtual关键字,如果没有要重写的方法,overridefinal都会给您一个编译器错误,但您或其他人可能希望在将来删除finaloverride

孟子墨
2023-03-14

在“方法1”中,虚拟确实是多余的。“覆盖”是一个特殊的标识符,它向代码的阅读器显示一个虚函数正在被覆盖,同时也是编译器验证它是否真的是的提示。基类已经声明该函数是虚的,所以没有必要再这样做了。

当不使用“final”关键字时,最好使用“virtual”,以保持可读性。在这种情况下,方法2是最佳实践符号。

这可以归结为你的环境中使用的风格,但是final并不意味着覆盖final。

 类似资料:
  • 问题内容: 我来自C ++,所以我不太了解Java的一项功能。我已经读过,除原始元素外,所有对象都必须使用关键字创建。现在,如果编译器可以识别原始类型,并且不允许您创建一个不带构造函数的对象,那么为什么根本没有关键字呢?有人可以提供一个示例,说明两行代码,除了存在的,相同,编译且具有不同的含义/结果之外,相同吗? 只是为了澄清我的意思是多余,并希望使我的问题更清楚。是否添加任何东西?语言是否可以通

  • 问题内容: 如果我在一个类中有以下声明,其中是抽象类型: 是否能让我仍然能够更改中的对象的状态,但阻止我将新对象添加到列表中?如果我写错了,请您解释一下正在做什么以及何时应该使用关键字。 问题答案: 不,final关键字不会使列表或其内容不可变。如果您想要一个不可变的列表,则应使用: final关键字的作用是防止您为’synapses’变量分配新值。即,您不能写: 但是,您可以编写:

  • 所以我在编译上面的代码时出现了明显的错误,但是错误是访问修饰符的非法组合,但是java文档http://docs.oracle.com/javase/tutorial/java/javao/accesscontrol.html说只有三个访问修饰符(public,private和protected),所以这些抽象的、最终的、public,private和protected是访问修饰符或访问说明符还是

  • 一段时间以来,我一直想知道,在最佳实践中,是否可以避免在< code>java.util.Map上使用< code>containsKey()方法,而是对< code>get()的结果进行空检查。 我的理由是,对值进行两次查找似乎是多余的——第一次是对< code>containsKey()进行查找,然后再次对< code>get()进行查找。 另一方面,可能是大多数的标准实现缓存了最后的查找,或

  • 问题内容: 在某些示例BlackBerry Java类中,我已经看到以下代码: 我认为这是为了表现。按照标题,由于几乎没有(曾经?)有任何理由修改已经抛出的,它们应该总是吗? 如果是这样,编译器是否可以完成此操作?还是由编译器完成,手动添加完全没有影响? 问题答案: Java语言规范11.2.2在最终异常与非最终异常之间进行了区别: 如果throw语句(第14.18节)的抛出表达式具有静态类型E,

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