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

本文深入探讨了C++中的菱形继承问题,包括虚拟继承的对象模型、内存布局及反汇编代码分析。作者通过实验代码揭示了虚基类成员在对象中的位置,并对比了不同编译器下的实现差异。


经过两天的摸索,今天终于搞清楚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.youkuaiyun.com/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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值