使用带有Final关键字的虚函数

问题描述 投票:0回答:1

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

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

为什么我们使用“final”来防止基类中的成员函数被派生类重写,同时我们仍然必须一起使用关键字VIRTUAL(ALLOW to override)。

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

c++ virtual-functions
1个回答
0
投票

首先,如果可以覆盖它们,我们只能停止覆盖函数。所以final只对虚拟功能有意义。

尽管如此,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!!!
};

声明Base::f虚拟和最终都会阻止隐藏(但不会超载)。

实际上,如果Base本身已经从另一个多态类继承,那么这个场景再次有意义。如果没有并且Base不打算继承,我根本不会引入任何虚函数(虚函数调用比普通函数调用更昂贵!)。如果那时用户仍然继承并隐藏了一个功能 - 那么,他自己的责任......

© www.soinside.com 2019 - 2024. All rights reserved.