C++内存模型测试
来源:互联网 发布:软件开发兼职网 编辑:程序博客网 时间:2024/04/29 10:01
class Base1
{public: Base1(int a):iBase(a){}; virtual ~Base1(void){} int getIBase() const{ return iBase;} static int instanceCount(){ return icount++;} virtual void print()const{}private: int iBase; static int icount;};
下面是编译器的结果:
创建一个类所需要的空间为
私有数据+需表指针
所有类之间共享
静态变量 , 静态函数 成员函数,虚函数(_vptr指向的虚表)
下面是继承:
class DrivedB1:public Base1{public: DrivedB1(int a):Base1(a),iDrived(a+5){}; virtual ~DrivedB1(void){} //int getIBase() const{ return iDrived;} static int instanceiDrivedCount(){ return iDrivedCount++;} virtual void print()const{cout << "DrivedB1" << endl;}private: int iDrived; static int iDrivedCount;};int DrivedB1::iDrivedCount = 3;
Derived不是虚继承,所以是扩充已存在的虚函数表. print 函数被重写,新虚函数被添加到虚表后面.
Base1* p = &a;
多重继承
从单继承可以知道,派生类中只是扩充了基类的虚函数表。如果是多继承的话,又是如何扩充的?
1) 每个基类都有自己的虚表。
2) 子类的成员函数被放到了第一个基类的表中。
3) 内存布局中,其父类布局依次按声明顺序排列。
4) 每个基类的虚表中的print()函数都被overwrite成了子类的print ()。这样做就是为了解决不同的基类类型的指针指向同一个子类实例,而能够调用到实际的函数。
单虚继承 保留了基类的虚表
在虚继承中,派生类和基类的数据,是完全间隔的,先存放派生类自己的虚函数表和数据,中间以0x分界,最后保存基类的虚函数和数据。如果派生类重载了父类的虚函数,那么则将派生类内存中基类虚函数表的相应函数替换。
普通多重继承
多重虚继承 上下两图对比一下就知道虚继承是怎么回事了.
0 0
- C++内存模型测试
- linux c内存模型
- C/C++内存模型
- c语言内存模型
- C内存模型
- C内存模型
- C/C++内存模型
- C/C++的内存模型
- C/C++内存分配模型
- C语言的内存模型
- C/C++程序内存模型
- C语言内存模型相关
- C语言的内存模型
- C和C++内存模型
- c语言程序内存模型
- C语言中的内存模型
- c++_8: c++_内存模型
- c/c++ 深入探讨数组内存模型
- ubuntu移植QT,遇到Error opening file(module/highgui/src/cap_ffmpeg.0:356)
- 关于虚函数
- POJ_1426_Find The Multiple(BFS)
- 在linux(redhat/centos)下安装postgresql-server
- 交换机参数
- C++内存模型测试
- 随想録 - フラ旅
- hrbust 1976 Back (2013年校赛 二分图+博弈)
- 关于Java的API无法正确显示的问题
- iOS放大镜例子,用View类实现
- BUPT OJ148 An Interesting Game
- (0.00.4 alpha版)太阳系漫游系统下载
- struts2知识点
- 2014-03-11周二Windows API 学习笔记