二十八、继承(五) 虚继承对C++对象内存模型造成的影响

一、虚继承对C++对象内存模型造成的影响
先看示例:
#include <iostream>
using namespace std;
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(void)
{
	cout<<sizeof(BB)<<endl;
	cout<<sizeof(B1)<<endl;
	cout<<sizeof(DD)<<endl;

	B1 b1;
	long** p;
	
	cout<<&b1<<endl;
	cout<<&b1.bb_<<endl;
	cout<<&b1.b1_<<endl;

	p = (long**)&b1;
	cout<<p[0][0]<<endl;
	cout<<p[0][1]<<endl;

	DD dd;
	cout<<&dd<<endl;
	cout<<&dd.bb_<<endl;
	cout<<&dd.b1_<<endl;
	cout<<&dd.b2_<<endl;
	cout<<&dd.dd_<<endl;
	p = (long**)dd;
	cout<<p[0][0]<<endl;
	cout<<p[0][1]<<endl;
	cout<<endl;
	cout<<p[2][0]<<endl;
	cout<<p[2][1]<<endl;

	BB* pp;

	pp = &dd;
	pp->bb_;		// 通过间接访问,这需要运行时的支持
	return 0;
}
运行结果:

根据结果我们可以分析出B1内存模型:

Dd对象内存模型:

由上面的对象内存模型可以看出,虚基类是共享的,所以虚基类表里要保存本虚基类表指针类地址到到虚基类的偏移。如果通过对象访问对象成员可以直接访问。如果通过指针访问虚基类里的成员,是通过虚基类地址与虚基类指针地址的差间接访问的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值