C++ 类对象内存布局
2019-06-03 10:02:12 0 举报
C++类和对象内存布局 (包含继承, 多继承, 虚拟继承)
作者其他创作
大纲/内容
指针指向 Left 的 type_info (用于实现RAII)
vbptr
public
Other类的虚函数表
指针指向 virtual ~Other::Other()指针指向 virtual void Other::FuncA()指针指向 virtual void Other::FuncOther(void)指针指向 virtual void Other::FuncOther2(int)
vptr
用于分割本类数据与虚继承基类数据
本类独有的数据
class Left(virtual public Base) 虚继承
+Left()+virtual ~Left()+virtual void FuncA(void) [重写]+virtual void FuncLeft(int) [新增]
+int m_dataLeft
Child 对象
指向 继承自 Left 虚函数表的 vptrint m_dataBaseint m_dataLeft指向 继承自 Other 虚函数表的 vptrint m_dataOtherint m_dataChild
Right 类的虚函数表(只存放 Right 自身新增的虚函数)
指针指向 virtual ~Bottom::Bottom() [重写]指针指向 virtual void Right::FuncRight(int)
Left 类的虚函数表(只存放 Left 自身新增的虚函数)
指针指向 virtual ~Left::Left()指针指向 virtual void Left::FuncLeft(int)
Left 对象
vptr 指向 Left 类的虚函数表int m_dataBaseint m_dataLeft
注意: 1. Child::FuncA() 既重写了 Left::FuncA() 又重写了 Other::FuncA(). 2. 继承自 Left 的虚函数表 与 继承自 Other 的虚函数表 在内存上可能不是相邻的.
Base 对象
vptr 指向 Base 类的虚函数表int m_dataBase
Base 类的虚函数表
指针指向 virtual ~Base::Base()指针指向 virtual void Base::FuncA(void)指针指向 virtual void Base::FuncB(int)
class Base
+Base()+virtual ~Base()+virtual void FuncA(void)+virtual void FuncB(int)
+int m_dataBase
第二个基类 Other 的数据
Left 类的虚函数表
指针指向 virtual ~Left::Left() [重写]指针指向 virtual void Left::FuncA(void)指针指向 virtual void Base::FuncB(int) [重写]指针指向 virtual void Left::FuncLeft() [新增]
本类的数据
虚继承基类的数据
指针指向 virtual ~Bottom::Bottom() [重写]指针指向 virtual void Bottom::FuncA(void) [重写]指针指向 virtual void Base::FuncB(int)
指针指向 Other的 type_info (用于实现RAII)
class Other
+Other()+virtual ~Other()+virtual void FuncA() [与Left::FuncA() 同名]+virtual void FuncOther()+virtual void FuncOther2(int)
+int m_dataOther
class Base (有虚函数)
继承自 Other 类的虚函数表
指针指向 virtual ~Child::Child()指针指向 virtual void Child::FuncA(void) [重写]指针指向 virtual void Child::FuncOther(void) [重写]指针指向 virtual void Other::FuncOther2(int)
继承自 Left 类的虚函数表
指针指向 virtual ~Child::Child() [重写]指针指向 virtual void Child::FuncA(void) [重写]指针指向 virtual void Child::FuncB(int) [重写]指针指向 virtual void Left::FuncLeft()指针指向 virtual void Child::FuncChild(int) [新增]
指针指向 Base 的 type_info (用于实现RAII)
Right 类数据
Right 对象
指向本类 虚函数表的 vptr指向 虚表 的 vbptrint m_dataRight//0x00000000基类的 vptrint m_dataBase
virtualpublic
Left 类数据
指针指向 virtual ~Bottom::Bottom() [重写]指针指向 virtual void Left::FuncLeft(int)指针指向 virtual void Bottom::FuncBottom(int) [新增]
1. 继承基类 Base 的虚函数表2. 把在本类中重写的虚函数替换进去3. 在末尾增加本类新增的虚函数
继承顺序中第一个基类 Left 的数据
自己的数据
+Bottom()+virtual ~Bottom()+virtual void FuncA(void) [重写]+virtual void FuncBottom(int) [新增]
+int m_dataBottom
+int m_dataChild
Data 对象
m_data
指向本类 虚函数表的 vptr指向 虚表 的 vbptrint m_dataLeft//0x00000000基类的 vptrint m_dataBase
virtual public
指针指向 Right 的 type_info (用于实现RAII)
Bottom对象
指向继承自 Left 虚函数表的 vptr指向继承自 Left 虚表 的 vbptrint m_dataLeft指向继承自 Right 虚函数表的 vptr指向继承自 Right 虚表 的 vbptrint m_dataRightint m_dataBottom//0x00000000 基类的 vptrint m_dataBase
指针指向 virtual ~Left::Left()指针指向 virtual void Left::FuncA(void)指针指向 virtual void Base::FuncB(int)
class Data(无虚函数)
+Data()+~Data()+void FuncA(void)+void FuncB(int)
+int m_data
Other 对象
vptr 指向 Other 类的虚函数表int m_dataOther
指针指向 Child 的 type_info (用于实现RAII)
class Left
+Left()+virtual ~Left()+virtual void FuncA(void) [重写FuncA]+virtual void FuncLeft(int)
class Right(virtual public Base) 虚继承
+Right()+virtual ~Right()+virtual void FuncA(void) [重写]+virtual void FuncRight(int) [新增]
+int m_dataRight
收藏
0 条评论
下一页