//虚继承对类大小的影响
//virtual 存在,共享,间接
#include <iostream>
using namespace std;
#define PRT(x) cout<<x<<endl
class BB
{
public:
int bb_;
};
class B1:virtual public BB
{
public:
int b1_;
};
class B2:virtual public BB
{
public:
int b2_;
};
class DD:public B1, public B2
{
public:
int dd_;
};
int main()
{
PRT(sizeof(BB));//4
PRT(sizeof(B1));//12
PRT(sizeof(B2));//12
PRT(sizeof(DD));//24
BB bb;
PRT(&bb);
PRT(&bb.bb_);
B1 b1;
PRT(&b1);
PRT(&b1.b1_);
PRT(&b1.bb_);
long** p = (long**)&b1;
PRT(p[0][0]);//0
PRT(p[0][1]);//8
PRT("------DD------");
DD dd;
PRT(&dd);
PRT(&dd.b1_);
PRT(&dd.b2_);
PRT(&dd.dd_);//编译时刻已经决定了以下内存模型,所以dd.bb_是直接访问
PRT(&dd.bb_);
p = (long**)ⅆ
PRT(p[0][0]);//0
PRT(p[0][1]);//20
PRT(p[2][0]);//0
PRT(p[2][1]);//12
PRT("--------------");
//通过基类指针访问虚基类的数据成员,不直接访问,只能间接访问,这需要运行时的支持
BB* pp = ⅆ
pp->bb_; //此时是间接访问,
PRT(&dd); //运行时会根据虚基类表找到dd中的虚基类部分的地址,
PRT(&(pp->bb_));//将其赋值给pp
return 0;
}
/*
虚继承后类的内存模型
B1
+---------+ 虚基类表指针指向虚基类表
| vbptr |---+ vbtl
+---------+ | +---------+
| b1_ | | | 0 |本类地址与虚基类表指针地址的差,如果没有虚函数(虚表)则为0
+---------+ +-->+---------+
| bb_ |BB | 8 |虚基类地址与虚基类表指针地址的差
+---------+ +---------+
DD
+---------+
| vbptr |---+ vbtl
+---------+ | +---------+
| b1_ | | | 0 |
+---------+ +-->+---------+
| vbptr |---+ | 20 |
+---------+ | +---------+
| b2_ | |
+---------+ | +---------+
| dd_ | | | 0 |
+---------+ +-->+---------+
| bb_ | | 12 |
+---------+ +---------+
*/
虚继承对类大小的影响
最新推荐文章于 2024-04-02 10:40:37 发布