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
简单虚拟继承对象
首先编写如下的测试程序:
上述程序的输出如下:
简单解释下:当存在虚基类时,先是子类的成员,然后才是虚基类的成员.
以下是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
相关文章推荐
- [C++对象模型][6]sizeof与对象内存布局
- c++对象模型 内存布局
- 图说C++对象模型:对象内存布局详解
- 图说C++对象模型:对象内存布局详解
- c++对象内存模型【内存布局】
- c++对象内存模型【内存布局】
- C++对象模型之详述C++对象的内存布局
- 【转】图说C++对象模型:对象内存布局详解
- c++对象模型和对象内存布局
- c++对象内存模型【内存布局】
- c++对象内存模型【内存布局】
- C++对象模型之简述C++对象的内存布局
- C++对象模型之详述C++对象的内存布局
- C++对象模型-详述C++对象的内存布局
- 三十二、C++内存布局,对象大小计算、虚函数虚继承对类内存模型的影响
- C++对象模型笔记:对象的三种内存布局
- 图说C++对象模型:对象内存布局详解
- c++对象内存模型【内存布局】
- C++对象模型的简述和内存布局
- C++对象模型笔记:对象的三种内存布局