我有一个关于在C ++中使用关键字final的问题。我知道虚函数是在基类中声明的成员函数,并且有望在派生类中被重写。通过动态绑定,将根据负责调用的对象的类型来调用适当的方法。但是,为防止基类中的成员函数在任何派生类中被覆盖,我们将使用final关键字。
void startEngine() final;// Compile error!
virtual void startEngine() final; //No error
为什么我们要使用“ final”防止基类中的成员函数在派生类中被覆盖,同时我们仍然必须一起使用关键字VIRTUAL(ALLOW来覆盖)。
我试图删除虚拟一词,但出现编译错误:“不能使用'final'修饰符声明非虚拟函数”
答案 0 :(得分: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
本身已经从另一个多态类继承,则这种情况还是有意义的。如果不是这样,并且{{1}}不打算被继承,那么我根本不会引入任何虚拟函数(虚拟函数调用比普通函数调用花费更多!)。如果那样的话,用户仍然继承并隐藏了一个功能–那么,他自己的责任...