您的位置:首页 > 编程语言 > C语言/C++

C++中继承的内存分布

2012-02-08 21:10 281 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: