总结一下VPTR 和 VTABLE 和类对象的关系:
每一个具有虚函数的类都有一个虚函数表VTABLE,里面按在类中声明的虚函数的顺序存放着虚函数的地址,这个虚函数表VTABLE是这个类的所有对象所共有的,也就是说无论用户声明了多少个类对象,但是这个VTABLE虚函数表只有一个。
在每个具有虚函数的类的对象里面都有一个VPTR虚函数指针,这个指针指向VTABLE的首地址,每个类的对象都有这么一种指针。
2、虚继承
这个是比较不好理解的,对于虚继承,若派生类有自己的虚函数,则它本身需要有一个虚指针,指向自己的虚表。另外,派生类虚继承父类时,首先要通过加入一个虚指针来指向父类,因此有可能会有两个虚指针。
二、(虚)继承类的内存占用大小
首先,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 因此,如果用sizeof运算符对一个类型名操作,那得到的是具有该类型实体的大小。
计算一个类对象的大小时的规律:
1、空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);
2、一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;
3、因此一个对象的大小≥所有非静态成员大小的总和;
4、当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable;
5、虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加一个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和一个vbPtr指针指向虚基表vbTable,这两者所占的空间大小为:8(或8乘以多继承时父类的个数);
6、在考虑以上内容所占空间的大小时,还要注意编译器下的“补齐”padding的影响,即编译器会插入多余的字节补齐;
7、类对象的大小=各非静态数据成员(包括父类的非静态数据成员但都不包括所有的成员函数)的总和+ vfptr指针(多继承下可能不止一个)+vbptr指针(多继承下可能不止一个)+编译器额外增加的字节。

虚函数占用类空间大小(转)相关推荐

  1. 如何理解虚表及其计算含虚函数的类的大小

    在什么情况下系统会自动生成缺省(默认)的构造函数? 1.在类里面有一个类类型的对象,这个类有自己的缺省构造函数(有缺省的参数,参数有缺省值). class B { B(int data) {  } } ...

  2. C++中虚函数工作原理和(虚)继承类的内存占用大小计算

    转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一.虚函数的工作原理       虚函数的实现要求对象携带额 ...

  3. C++中的虚函数(virtual function)

    1回顶部 一.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: class A { public: virtua ...

  4. C++中重载与重写函数区别及虚函数(转载)

    C++中重载与重写函数区别及虚函数 C++中的虚函数(virtual function) 1.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的 ...

  5. 中有atoi函数吗_C++ 多态的实现及原理,深挖vptr指针,手动调用虚函数

    什么是多态? 父类指针即根据指向的不同对象,响应同一消息(函数调用),产生不同行为. 多态三要素? 1,继承 2,虚函数重写 3,父类指针(引用)指向子类对象 多态的实现很简答,让我们来看一段代码 # ...

  6. c 语言的虚函数,C 中的虚函数(virtual function)

    一.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: class Father { public: virtua ...

  7. C++中虚函数工作原理

    转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一.虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这 ...

  8. C++中虚函数继承类的内存占用大小计算

    前半部分转自https://www.cnblogs.com/SeekHit/p/7570247.html 其中为32位字节对齐,后半部分给出自己的理解. 字节对齐的原理见链接https://www.c ...

  9. 空类,虚函数类,虚继承类的空间大小

    //此代码在32位win下运行成功 #include<iostream> using namespace std; class A//A是空类,编译器会用一个char类型标记这个类,大小为 ...

最新文章

  1. android 手写字体识别,一种基于Android系统的手写数学公式识别及生成MathML的方法...
  2. java基础 多维数组_java基础:3.2 多维数组
  3. 多人编辑、共享思维导图
  4. 海量数据的分库分表技术演进,最佳实践
  5. 国际农产品市场谋定特点趋势 对话国际农民丰收节贸易会
  6. c++稀疏表sparse table的实现算法(附完整源码)
  7. WIN8 启用虚拟AP 以共享网络,使手机电脑一起网上冲浪
  8. 重要的ui组件——Behavior
  9. 地址栏 输入 参数 刷新参数丢失_小米11 Pro屏幕参数曝光:2K屏幕+120Hz刷新率
  10. python分类下取得所有子类_如何找到给定名称的类的所有子类?
  11. 腾讯微博等7家网站实行实名制
  12. 河北源达投顾:用专业教学,用智能解决选股烦恼
  13. 第一章---近红外光谱概述2(近红外光谱分析难点及解决思路)
  14. 联想万全r520服务器安装系统,联想(lenovo)万全R520服务器图解
  15. Mac M1 使用conda安装jupyter notebook
  16. 二、赛普拉斯EZ-USB FX3示例烧录验证
  17. 用matlab实现任意点图片的旋转_Matlab实现图像旋转
  18. Levenberg-Marquardt
  19. 数据处理——片假名→平假名转换算法
  20. medoo update mysql_new medoo()

热门文章

  1. 最新速卖通提前放款服务解读,帮助商家减轻资金压力!
  2. 记一次hydra密码破解神器的学习
  3. 华为手机居然还能这样提高续航?简单设置一下,一天一充很轻松
  4. gtx1660是什么级别的_GTX1660Ti和1660区别对比 GTX1660和1660Ti差距大吗
  5. 7.2判断是否手机端进行访问页面
  6. DBA职业规划技术成长路线
  7. 笔记本外接显示器,过一段会自动休眠
  8. 解决Linux“Device is busy”与磁盘只读
  9. 教你免费使用论文检索网,轻松下载
  10. UVA(WA) 10815 安迪的第一个字典