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

将虚函数与 Final 关键字结合使用

尤飞尘
2023-03-14

关于在C中使用关键字final,我有一个问题。我知道虚函数是在基类中声明的成员函数,它应该在派生类中重写。通过动态绑定,将根据负责调用的对象的类型调用适当的方法。但是,为了防止基类中的成员函数在任何派生类中被重写,我们将使用final关键字。

void startEngine() final;// Compile error!
virtual void startEngine() final; //No error

为什么我们使用“最终”来防止基类中的成员函数在派生类中被覆盖,同时我们仍然必须一起使用关键字VIRTUAL(允许覆盖)。

我试图删除虚拟这个词,但我得到一个编译错误:“非虚拟函数不能用'final'修饰符声明”

共有1个答案

洪逸清
2023-03-14

首先,我们只能在可以重写函数的情况下停止覆盖函数。所以最终只对虚函数有意义。

尽管如此,应用于单个类的虚函数的< code>final可能看起来毫无意义。但是如果你考虑一个更复杂的层次结构,事情就变了:

class Parent
{
public:
    virtual ~Parent() = default;
    virtual void f();
};
class Child : public Parent
{
public:
    void f() final; // f IS virtual already...
};
class GrandChild : public Child
{
    // cannot override f any more – while Child still could!
};

此外,请考虑以下事项:

class Base
{
public:
    virtual ~Base() = default;
    void f(); // non-virtual! (i. e. cannot be overridden)
};
class Derived : public Base
{
public:
    void f(); // does not override, but HIDEs Base::f!!!
};

将< code>Base::f声明为virtual和final也可以防止隐藏(但不会重载)。

事实上,如果<code>Base</code>本身已经从另一个多态类继承,那么这个场景也是有意义的。如果不是,并且<code>Base</code>不打算被继承,我根本不会引入任何虚拟函数(虚拟函数调用比普通函数调用成本更高!)。如果用户仍然继承并隐藏了一个函数,那么他自己的责任。。。

 类似资料:
  • 问题内容: 这是我尝试在其上使用该函数的循环: 有办法吗?如果不是参数,那将是微不足道的,但是我不确定如何处理。 问题答案: 用途: 创建一个新的可调用对象,除了传递给该新的可调用对象的内容之外,该参数还将对包装的函数应用所有参数(包括关键字参数)。

  • C 11添加了<code>override</code>,以确保您编写的打算重写基类虚拟函数的成员函数实际执行(或不会编译)。 但在大型对象层次结构中,有时您可能会意外地编写一个成员函数,该函数在您不打算的情况下重写基类virtual!例如: 有没有某种编译器标志/扩展至少会在< code>C::foo上发出警告?为了可读性和正确性,我只想强制所有的覆盖都使用< code>override。

  • 我一直在使用越来越多的C11,我遇到了一些我在任何地方都找不到的东西。当我们从基指针中删除派生类时,我们需要有虚拟析构函数;但有时父析构函数需要“纯”,这在C中是不可能的。所以,我的问题是,默认值是否可以用于虚拟析构函数?我已经试过了,而且效果不错,但我不知道它是否安全,因为互联网上没有任何关于它的信息。 编辑:为了澄清这个问题,我说的是使用

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

  • 我刚刚在玩final关键字,并观察到下面的行为,这里我使用一个方法赋值一个final变量,并且该方法在构造函数之前被调用 下面的代码输出如下 我知道在构造函数完成之前需要赋值final变量,这就是这里发生的事情 我找不到的是如何在构造函数之前调用方法,我非常感谢对此的任何解释

  • 本文向大家介绍浅谈Java中的final关键字与C#中的const, readonly关键字,包括了浅谈Java中的final关键字与C#中的const, readonly关键字的使用技巧和注意事项,需要的朋友参考一下 在编程语言中都有某种方式,告知编译器一块数据是恒定不变的。有两个需求 1. 一个永不改变的编译器常量 2. 一个在运行时被初始化的值,而这个值不会被改变 在Java中,使用fina