您的位置:首页 > 编程语言 > C语言/C++

C++对象模型之内存布局(3)

2018-01-14 16:25 330 查看
经过两天的摸索,今天终于搞清楚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/

本文转自:

https://mp.weixin.qq.com/s?__biz=MzIwNTc4NTEwOQ==&mid=2247484192&idx=1&sn=15e8cf3690dbe152247d116dfd847ab1&chksm=972ad25aa05d5b4c043201771e44fcbef43ddddfb62a61fccff093b527a237d7a6b34d35fbdd&mpshare=1&srcid=1222rYOiOwauk1T0bBhRSbLr&scene=21#wechat_redirect
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: