一概念:
1. 没有继承情况, vptr 存放在对象的开始位置, 以下是 Base1 的内存布局
m_iData :100
2. 单继承的情况下, 对象只有一个 vptr, 它存放在对象的开始位置, 派生类子对象在父类子对象的最后面, 以下是 D1 的内存布局
- B1:: m_iData : 100
- B1::vptr :4294800
- B2::vptr :4294776
- D::m_iData :300
4. 虚拟继承情况下, 虚父类子对象会放在派生类子对象之后, 派生类子对象的第一个位置存放着一个 vptr, 虚拟子类子对象也会保存一个 vptr, 以下是 VD1 的内存布局
- Unknown :4294888
- B1::vptr :4294864
- VD1::vptr :4294944
- VD1::m_iData :200
- VD2::Unknown :4294952
- VD::m_iData :500
- B1::m_iData :100
5. 棱形继承的情况下, 非虚基类子对象在派生类子对象前面, 并按照声明顺序排列, 虚基类子对象在派生类子对象后面
- VD1::Unknown : 4294968
- VD2::vptr :4294932
- VD2::m_iData :300
- B1::vptr :4294920
- B1::m_iData :100
谢谢!!!
来源: http://www.jianshu.com/p/4928cf776d2e