C++对象模型之内存布局(3)
转载地址:https://mp.weixin.qq.com/s/dTyAC2IQ50c9nmQGOC0c2A
经过两天的摸索,今天终于搞清楚C++对象模型.前两篇C++对象模型之内存布局(2)C++对象模型之内存布局(1)(请戳我)已经讲解了单继承,多重继承和多继承的对象模型.今天讲解菱形继承,虽然过程艰难,但是收获丰富.
简单虚拟继承对象
首先编写如下的测试程序:
上述程序的输出如下:
简单解释下:当存在虚基类时,先是子类的成员,然后才是虚基类的成员.
以下是C对象的对象模型:
通过在gdb下,输入指令:
也可以输出C对象的对象模型.截图如下:
我在理解这个的时候,有分析过c对象调用虚基类的成员方法.通过反汇编代码,我发现当cp调用A中方法时,它先从C类的虚函数表首地址-24字节处获取A子对象相对于cp的偏移量16.所以C的虚函数表首地址负方向的空间还是有研究的地方。
当我把C对象的函数f1改成f时,即重写A中的f方法,这时cp中A的子对象中f方法将被C的f方法替换,但是程序输出有错,原因不明。如下:
菱形继承下的对象模型
编写如下程序:
此时程序输出仍然有错,因为c重写了A中的方法。原因不明。c对象模型为:
如果c不重写A的f方法,即将A的f方法改为f0,则程序输出如下:
我都实在ubuntu下,g++编译器实现的。但是vs的编译器实现是不同,关于vs平台,大家可以看看陈皓的博客,附上陈皓的博客:http://blog.****.net/haoel/article/details/3081328/