#includeusing namespace std; class Animal { public: Animal(){} ~Animal(){} int m_A = 1; private: }; class Needy : virtual public Animal { public: Needy(){} ~Needy(){} private: }; class Horse :virtual public Animal { public: Horse(){} ~Horse(){} private: }; class Mule : public Needy, public Horse { public: Mule(){} ~Mule(){} private: }; void test01() { Mule mule1; cout << mule1.m_A << endl; } int main() { test01(); }
继承关系
class Horse :virtual public Animal class Needy : virtual public Animal
class Mule : public Needy, public Horse
Horse和Needy进行的是虚继承,这样Mule只会从Animal类继承一份 int m_A
使用VS Tools 中的VS 2017 开发者命令提示符查看,Mule的内存模型
F:Visual Studio IDE>cd F:DesktopC++this指针继承 F:DesktopC++this指针继承>cl /d1 reportSingleClassLayoutMule main.cpp
命令如上
class Mule size(12):
+---
0 | +--- (base class Needy)
0 | | {vbptr}
| +---
4 | +--- (base class Horse)
4 | | {vbptr}
| +---
+---
+--- (virtual base Animal)
8 | m_A
+---
Mule::$vbtable@Needy@:
0 | 0
1 | 8 (Muled(Needy+0)Animal)
Mule::$vbtable@Horse@:
0 | 0
1 | 4 (Muled(Horse+0)Animal)
vbi: class offset o.vbptr o.vbte fVtorDisp
Animal 8 0 4 0
Microsoft (R) Incremental Linker Version 14.16.27045.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:main.exe
main.obj
Mule中只会存衣服Animal中的int m_A ,Needy和Horse区域只会存一份指向int m_A的指针偏移量



