文章目录

  • 1、虚函数表指针
  • 2、多态构成的条件
  • 3、重载、重写、重定义 三者区别
  • 4、继承与虚函数
  • 5、单继承中的虚函数表
    • 无虚函数覆盖
    • 有虚函数覆盖
  • 6、单继承中的虚函数表
    • 无虚函数覆盖
    • 有虚函数覆盖
  • 参考

看《深度探索c++对象模型》的时候对虚表有了点疑惑,正好网上有些文章解除了这个疑惑,记录一下

1、虚函数表指针

在64位操作系统下当我们计算包含虚函数的类大小时,我们会发现不管类中有几个虚函数,类的大小都会比没有虚函数时类的大小大8,这是因为存了一个指向虚表的指针,大小为8字节。
对象中的这个指针我们叫做虚函数表指针,虚函数指针指向的这个表叫虚函数表简称虚表,虚表中存的是虚函数的地址

图1 类代码 图2 对象模型

2、多态构成的条件

  • 必须通过父类的指针或者引用调用虚函数
  • 父类的函数必须是虚函数,且子类必须对父类的虚函数进行重写

3、重载、重写、重定义 三者区别

4、继承与虚函数

在构造子类前会先构造父类,而在构造父类的时候,通过this指针看到如下图左所示,虚函数表中存的父类中的三个虚函数的地址,而在构造子类的时候,可以看到如下图右所示,父类中的虚函数在子类中被重写的两个虚函数将父类的虚函数覆盖了,这就是多态父类指针保存子类地址却可以通过父类指针访问子类成员的原因

当我们在子类中对父类的虚函数重写后,当父类去调用该虚函数的时候,就会访问虚表,然而虚表中存放的是已经被子类覆盖的子类的函数,所以就会转去调用子类中的重写的虚函数。

其实子类的虚函数是在虚表中的,只不过从监视器的角度看不到,因为从监视器的角度__vfptr的成员始终属于父类的成员。

5、单继承中的虚函数表

无虚函数覆盖

虚函数按照其声明顺序放于表中;
父类的虚函数在子类的虚函数前面;

有虚函数覆盖

覆盖的fun1()函数被放到了虚函数表中原来父类虚函数的位置
没被覆盖的函数依旧

6、单继承中的虚函数表

无虚函数覆盖

每个父类都有自己的虚表
子类的成员函数被放到第一个父类的表中(所谓第一个父类是按照声明顺序来判断的)------>这样做是为了解决不同的父类类型的指针指向同一个子类实例,而能够调用到实际的函数

子类实例中的虚函数表如下图所示:

有虚函数覆盖

只要子类中重写的父类的虚函数都会覆盖
没被覆盖的函数依旧

子类虚函数表如下:

参考

https://blog.csdn.net/weixin_50886514/article/details/117536971
https://bbs.csdn.net/topics/370154900?page=3

c++关于虚表的一些笔记相关推荐

  1. C++编程思想重点笔记(下)

    上篇请看:C++编程思想重点笔记(上) 宏的好处与坏处 宏的好处:#与##的使用 三个有用的特征:字符串定义.字符串串联和标志粘贴. 字符串定义的完成是用#指示,它容许设一个标识符并把它转化为字符串, ...

  2. Oracle 学习笔记 11 -- 视图 (VIEW)

    本次必须学习一个全新的概念-- 视图 (VIEW).在前面的笔记中曾提到过,数据对象包含:表.视图.序列.索引和同义词.前面的笔记都是对表的想剖析,那么本次笔记就对视图的世界进行深入的剖析. 视图是通 ...

  3. MySQL服务器学习笔记!(二) ——数据库各项操作

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://foreveryan.blog.51cto.com/3508502/657640 ...

  4. 数据库笔记: SQL

    1 数据库语言 DBMS提供操作命令和语言,使用户能够对数据库进行各式各样的操作,例如查询.增.删.改数据,定义.修改数据模式等 --- >这就构成了用户和数据库的接口. DBMS所提供的语言一 ...

  5. 后台接收数组_「面试必备」最新整理出的腾讯C++后台开发面试笔记

    文章是由笔试面试腾讯笔记整理而来,主要是针对面试的C++后台开发岗位,涵盖了大部分C++后台开发相关可能会考察和被问到的技术点. 自认为这篇笔记是比较全面的总结,不管你是已经工作准备参加社招,还是在校 ...

  6. MySQL 笔记7 -- 权限操作与视图

    MySQL 笔记7 – 权限操作与视图 MySQL 系列笔记是笔者学习.实践MySQL数据库的笔记 课程链接: MySQL 数据库基础入门教程 参考文档: MySQL 官方文档 SQL 教程 一.权限 ...

  7. Qt学习笔记之数据库

    一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...

  8. python后台开发知识点_面试总结:鹅厂Linux后台开发面试笔试C++知识点参考笔记...

    文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 文章是由自己笔试面试腾讯的笔记整理而来,整理的时候又回顾了一遍,中间工 ...

  9. 后台接收数组_腾讯C++后台开发面试笔试知识点参考笔记

    来自公众号:后端技术学堂 文章是由我笔试面试腾讯笔记整理而来,主要是针对面试的C++后台开发岗位,涵盖了大部分C++后台开发相关可能会考察和被问到的技术点. 自认为这篇笔记是比较全面的总结,不管你是已 ...

最新文章

  1. AI一分钟 | 豪华太空酒店预计2022年前开业;彭蕾卸任蚂蚁金服董事长,井贤栋接任;京东推出一秒能写千条文案的AI系统
  2. 直播APP开发注意事项汇总
  3. python下载安装教程2.7-Python2.7.6下载
  4. boost::hana::detail::first_unsatisfied_index用法的测试程序
  5. ITK:获取图像中标记区域的统计属性
  6. 转:char*, char[] ,CString, string的转换
  7. 后台服务器端技术点(前沿了解)
  8. 从数据仓库到报表,再到可视化,数字化物流是这么设计架构的
  9. elasticsearch的一个bug总结
  10. ArcMap增加图标
  11. 在线分析mysql死锁详解_记一次线上mysql死锁分析(一)
  12. python实现:用类实现一个图书馆,实现借书,入库,还书,查书,等功能,要求数据可以保存到文件中,退出后下次可以找回数据...
  13. linux MySQL5.7 rpm安装
  14. 服务器版操作系统驱动精灵,驱动精灵2008 Beta 3发布
  15. KVM虚拟化技术浅析
  16. 可能是最全的h5唤起App方案
  17. HTML中禁止自动完成和禁用输入法
  18. python怎么爬虎牙_Python爬虫:爬取虎牙星秀主播图片
  19. delegation机制
  20. hadoop3源码编译

热门文章

  1. 调整echarts中图与legend的距离
  2. c#设计模式——迭代器模式
  3. java开发感觉很难_为什么很难找到优秀的Java开发人员?
  4. 阿里云一面:并发场景下的底层细节 - 伪共享问题
  5. idea控制台中文乱码问号解决
  6. 警察和土匪游戏 Linux案例
  7. 给body加100vh,100vm出现滚动条的解决方法
  8. WireMock的应用
  9. 移植cocos2d-x 游戏从Android平台到IOS平台分辨率问题及解决办法
  10. [深度之眼]TensorFlow2.0项目班-猫狗图片分类