将虚拟函数与最终关键字结合使用
Using Virtual Function with Final keyword
我有一个关于在C++中使用关键字final的问题。我知道虚函数是在基类中声明的成员函数,并且预计在派生类中会被覆盖。通过动态绑定,将调用适当的方法,具体取决于负责调用的对象的类型。但是,为了防止基类中的成员函数在任何派生类中被重写,我们将使用 final 关键字。
void startEngine() final;// Compile error!
virtual void startEngine() final; //No error
为什么我们使用"final"来防止基类中的成员函数在派生类中被覆盖,同时我们仍然必须一起使用关键字VIRTUAL(ALLOW覆盖(。
我试图删除虚拟这个词,但我得到一个编译错误:"非虚拟函数不能用'final'修饰符声明">
首先,我们只能在可以覆盖函数的情况下停止覆盖函数。因此,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
不打算继承,我根本不会引入任何虚函数(虚拟函数调用比普通函数调用更昂贵!如果那时用户仍然继承和隐藏一个函数——好吧,他自己的责任......
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 多态性和功能结合
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 将 Vulkan 与 SFML 结合使用?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- 将 c++ 生成器应用程序与外部 dll 结合使用
- C++函数的关键字?
- 如何将增强MSM与增强信号结合使用?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 将虚拟函数与最终关键字结合使用
- 为什么C++编译器允许 extern 关键字与定义相结合