C++虚继承内存布局

本文详细探讨了C++中菱形继承的内存布局,通过Visual Studio 2019编译器展示了B、B1、B2及派生类D的内存结构。内容包括虚函数指针、虚基表指针、vtordisp以及数据成员的存储情况。解释了虚基表指针的存储内容以及多重继承时虚函数表的组织原则。
摘要由CSDN通过智能技术生成

C++菱形继承内存布局

编译器:Visual Studio 2019
关于如何查看内存布局

B

class B
{
   
public:
	B()
		: _ib(10)
		, _cb('B')
	{
   
		cout << "B()" << endl;
	}
	B(int ib, char cb)
		: _ib(ib)
		, _cb(cb)
	{
   
		cout << "B(int,char)" << endl;
	}
	virtual
	void f()
	{
   
		cout << "B::f()" << endl;
	}
	virtual
	void Bf()
	{
   
		cout << "B::Bf()" << endl;
	}
private:
	int _ib;
	char _cb;
};

B内存布局图:size = 12
虚函数指针(4B)
int型数据成员(4B)
char型数据成员(4B,3B用于对齐)

1>class B	size(12):
1>	+---
1> 0	| {
   vfptr}
1> 4	| _ib
1> 8	| _cb
1>  	| <alignment member> (size=3)
1>	+---
1>B::$vftable@:
1>	| &B_meta
1>	|  0
1> 0	| &B::f
1> 1	| &B::Bf
1>B::f this adjustor: 0
1>B::Bf this adjustor: 0

B1

class B1
: virtual public B
{
   
public:
	B1()
		: _ib1(100)
		, _cb1('1')
	{
   
	}
	B1(int ib, char ic, int ib1, char cb1)
		: B(ib, ic)
		, _ib1(ib1)
		, _cb1(cb1)
	{
   
		cout << "B1(int,char,int,char)" << endl;
	}
	virtual
	void f()
	{
   
		cout << "B1::f()" << endl;
	}
	virtual
	void f1()
	{
   
		cout << "B1::f1()" << endl;
	}
	virtual
	void Bf1()
	{
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值