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.csdn.net/haoel/article/details/3081328/

猜你喜欢

转载自blog.csdn.net/gaoxueyi551/article/details/81351985