C++中继承的内存分布

C++中继承的内存分布

分类: C++ 56人阅读 评论(0) 收藏 举报
class Base
{
public :
int m_base;
};

class DerivedA: public Base
{
public :
int m_derivedA;
};

class DerivedB: public Base
{
public :
int m_derivedB;
};

class DerivedC: public DerivedA, public DerivedB
{
public :
int m_derivedC;
};

类结构图:

内存分布图:

DerivedC:

DerivedA::m_base

m_derivedA

DerivedB::m_base

m_derivedB

m_derivedC

====================================================

如果DerivedB 和 DerivedC 都是虚继承 , 即 virtual public Base
这时内存布局:

DerivedC:

objDerivedA::vbptr

objDerivedA::m_derivedA

objDerivedB::vbptr

objDerivedB::m_derivedB

m_derivedC

m_base 只有一份

类似于这个:

=================================================================
Base, DerivedA, DerivedB 各增加一个虚函数

则内存布局为:
DerivedB:
DerivedB::vfptr
DerivedB::vbptr
DerivedB::m_derivedB
Base::vfptr
Base::m_base
DerivedC:
DerivedA::vfptr 04
DerivedA::vbptr 08
DevivedA::m_derivedA 0C
DevivedB::vfptr 10
DerivedB::vbptr 14
DerivedB::m_derivedB 18
m_derivedC 1C
Base::vfptr 20
m_base 24
如果是这样呢?
class A{}
class B1: classA{virtual fun()}
class B2: virtual public classA{virtual fun()}
class C: public B1,public B2{} 这样Virtual继承起不到作用, C还是有两个内嵌A对象,就是有两个m_base
Class C:
DerivedA::vfptr
DerivedA::m_base
DerivedA::m_derivedA
DerivedB::vfptr
DerivedB::vbptr
DerivedB::m_derivedB
m_derivedC
DerivedB::m_base
总结:
先基类元素后继承类元素
有虚函数只是增加vfptr;继承的类如果有增加虚函数,向vtable增加函数指针
虚继承增加vbptr,注意:虚基类元素排在最后(这个是和 先基类后继承 不同之处)
注意上面,凡是打上了vbptr的类, DerivedB::m_base都被打到了最后。
vfptr在vbptr之前
转载于:http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值