当前位置: 首页 > news >正文

C++11 override和final关键字

C++11中的override和final关键字是为了增强代码的编译时类型检查和面向对象设计中的继承机制。

override关键字用于显示地表明派生类中的成员函数覆盖了基类中的虚函数。当派生类中的函数与基类中的虚函数签名不同或者没有使用override关键字时,编译器会给出警告或错误提示。这样可以避免因为函数签名不同而无法正确覆盖基类中的虚函数,从而导致程序运行时的错误。

final关键字用于显示地防止在派生类中重载某个函数。如果在一个虚函数上使用了final关键字,那么任何派生类都无法再对该函数进行重载。

当 final 用于类上时,它表示该类是最终类,不能被派生出子类。

class Base final { ... };

当 final 用于成员函数上时,它表示该函数不能被重写

class Base {
public:virtual void foo() final;
};class Derived : public Base {
public:// 以下代码会报错virtual void foo() override;
};

当 final 用于虚函数上时,它表示该虚函数不能被覆盖

class Base {
public:virtual void foo();
};class Derived : public Base {
public:// 以下代码会报错virtual void foo() final;
};

其他:

基类中将虚函数声明为私有函数 和 将虚函数声明为 final 的效果是不同的。

将虚函数声明为私有函数,可以让子类无法直接调用该函数,但子类仍然可以定义一个同名的函数来实现其自己的功能。这种情况下,虚函数的目的是为了供子类重写,但是基类本身并不想让子类直接使用虚函数的实现。

而将虚函数声明为 final,则是为了明确告诉子类,该函数不允许被重写。这是因为基类已经认为该函数已经具备了足够的功能,不需要子类重新实现。同时,final 也可以起到一定的优化作用,因为编译器可以在编译时确定该函数的调用路径,从而提高程序的效率。

此外,将虚函数声明为私有函数并不能完全防止子类重写该函数。子类可以通过其他方式(如友元函数、内联函数等)来访问该函数,并在其内部实现同名函数来达到重写的目的。而将虚函数声明为 final,可以确保子类无法重写该函数,从而保证程序的正确性和安全性。

因此,尽管将虚函数声明为私有函数可以达到一定的效果,但是如果真正想防止子类重写该函数,还是应该使用 final 关键字。

http://www.lryc.cn/news/90144.html

相关文章:

  • kafka的log存储解析
  • 4.文件系统
  • Shell脚本case in esac分支语句应用
  • 【线性dp必学四道题】线性dp四道经典例题【最长上升子序列】、【最长公共子序列】、【最长公共上升子序列(maxv的由来)】【最长公共子串】
  • 追寻幸福:探索幸福的关键特征和行为
  • Redis-02-集群
  • 【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第三章——MindSpore云上调试调优
  • python笔记17_实例演练_二手车折旧分析p2
  • android 12.0长按Power弹出关机对话框去掉屏幕截图和紧急呼救功能
  • 2023年下半年软考高级需要报班吗?
  • 使用WordPress提高企业敏捷性
  • SSM编程---Day 07
  • Seata术语
  • 【Axure教程】通过文本框维护下拉列表选项
  • 【C++】基础知识--输入/输出(5)
  • 经典文献阅读之--PIBT(基于可见树的实时规划方案)
  • SAP-MM-计算方案字段解析
  • go-gf框架两个表以事务方式写入示例
  • 2023-5-31第三十一天
  • 什么是MQTT?mqtt协议和http协议区别
  • 平台使用篇 | 批处理(bat)脚本使用教程(四)
  • 接口的讲解
  • G0第21章 :gin框架介绍、RESTful API、Gin渲染
  • python list,dict操作
  • 我有一个页面a,在页面a中调用了一个组件,然后组件中要切换页面a的一块区域,该怎么实现?
  • ChatGPT唤醒AI游戏:AIGC持续走深,游戏或成AI最佳抓手
  • 远程服务和web服务和前端,三方通过socket和websocket进行双向通信传输数据
  • Linux 网络基础(2)应用层(http/https协议、请求格式、响应格式、session、cookie、加密传输)
  • 解决sshfs挂载报错
  • 由于过多的连接错误而被 MySQL服务器 阻止