C++对象内存布局--⑤GCC编译器--单个虚拟继承

  测试GNU的GCC编译器在处理虚拟继承上跟VS不同的地方。派生类的虚函数表跟虚基类表合并。

//GCC编译器--单个虚拟继承.cpp
//2010.8.18
//虚基类表到底是那个?,还是说派生类的虚函数表的上边和下边都是?
//GCC编译器
#include <iostream>
using   namespace std;
//
class Base
{public:Base(int a = 10):a(a){cout << "Base::Base()" << endl;}virtual void show1(){cout << "Base::show1()" << endl;cout << a << endl;}private:int a;
};
//
class Derived : virtual public Base
{public:Derived(int b = 100):b(b){cout << "Derived::derived()" << endl;}virtual void show2(){cout << "Derived::show2()" << endl;cout << b << endl;}private:int b;
};
//
int main()
{Derived obj;int** p = (int**)&obj;cout << "虚拟继承了基类的派生类的对象内存布局:" <<endl;for (int i = 0; i != sizeof(obj)/4; ++i){cout << p[i] << endl;}typedef void (*fun)(void*pThis);//this指针非常重要cout << endl << "第一虚函数表第一项,虚函数Derived::show2()地址:" << (int*)p[0][0] << endl;((fun)(p[0][0]))(p);cout << "第二虚函数表第一项,虚函数Base::show1()地址   :" << (int*)p[2][0] << endl;((fun)(p[2][0]))(p+2);cout << endl << "派生类虚函数表指针往低地址方向寻址:" << endl;cout << "p[0][-1] = " << (int*)p[0][-1] << endl;cout << "p[0][-2] = " << (int*)p[0][-2] << endl;cout << "p[0][-3] = " << (int*)p[0][-3] << endl;cout << endl << "派生类虚函数表指针往高地址方向寻址:" << endl;cout << "p[0][0] = " << (int*)p[0][0] << "(这个是show2()函数地址)" << endl;cout << "p[0][1] = " << (int*)p[0][1] << endl;cout << "p[0][2] = " << (int*)p[0][2] << endl;cout << "p[0][3] = " << (int*)p[0][3] << endl;cout << endl << "是否往高方向寻找和往地方向寻找所找到的都是虚基类表呢?" << endl;//system("pause");return 0;
}
/*
Base::Base()
Derived::derived()
虚拟继承了基类的派生类的对象内存布局:
0x472d4c
0x64
0x472d5c
0xa第一虚函数表第一项,虚函数Derived::show2()地址:0x41cd50
Derived::show2()
100
第二虚函数表第一项,虚函数Base::show1()地址   :0x41ccbc
Base::show1()
10派生类虚函数表指针往低地址方向寻址:
p[0][-1] = 0x471388
p[0][-2] = 0
p[0][-3] = 0x8派生类虚函数表指针往高地址方向寻址:
p[0][0] = 0x41cd50(这个是show2()函数地址)
p[0][1] = 0
p[0][2] = 0xfffffff8
p[0][3] = 0x471388是否往高方向寻找和往地方向寻找所找到的都是虚基类表呢?
*/

转载于:https://www.cnblogs.com/cswuyg/archive/2010/08/20/1804087.html

C++对象内存布局--⑤GCC编译器--单个虚拟继承相关推荐

  1. C++对象内存布局--④VS编译器--单个虚拟继承

    C++对象内存布局--④VS编译器--单个虚拟继承 在VS2005编译器下,证明单个虚拟继承的内存布局:无论有无虚函数,必然含有虚基类表指针.虚基类表中的内容为本类实例的偏移和基类实例的相对偏移值. ...

  2. C++对象内存布局测试总结

    C++对象内存布局测试总结 http://hi.baidu.com/����/blog/item/826d38ff13c32e3a5d6008e8.html 上文是半年前对虚函数.虚拟继承的理解.可能 ...

  3. 【C++】C++对象模型:对象内存布局详解(C#实例)

    C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...

  4. C++ 对象内存布局 (4)

    注意:关于内存对齐(memory alignment),请看关于内存对齐问题,后面将会用到. 下面我们进行在普通继承(即非虚继承)时,派生类的指针转换到基类指针的情形研究.假定各类之间的关系如下图: ...

  5. C字节对齐与C++类对象内存布局

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  6. 图说C++对象模型:对象内存布局详解

    目录 1.何为C++对象模型? 2.文章内容简介 3.理解虚函数表 3.1.多态与虚表 3.2.使用指针访问虚表 4.对象模型概述 4.1.简单对象模型 4.2.表格驱动模型 4.3.非继承下的C++ ...

  7. C++对象内存布局(转载)

    C++对象内存布局(转载) 转载地址:http://www.cppblog.com/stdyh/archive/2007/01/08/17442.html 写这个文章完全是因为想要搞清楚 vc 怎么布 ...

  8. C++对象内存布局--①测试虚函数表属于类

    C++对象内存布局--①测试虚函数表属于类 测试1:同一个类的多个对象共享同一张虚函数表.   //虚函数表.cpp //2010年8月18日 //测试虚函数表,说明虚函数表属于类所有.同一个类的多个 ...

  9. C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中

    C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中 测试2:证明派生类的虚函数的地址跟第一基类的虚函数地址保存在同一张虚函数表中. 派生类有多少个拥有虚函数的基类,派生类对象就有多少 ...

最新文章

  1. python画-一步一步教你如何用Python画一个滑稽
  2. 一个在分割、检测与定位、高分辨率通用的网络
  3. Operation condition And timing analysis
  4. 解决RHEL sendmail服务启动慢
  5. Docker中安装Jenkins实时发布.net core 项目(一)
  6. 个别学生计算机辅导计划,网络学院计算机基础统考辅导计划.doc
  7. 源码分析Android Handler是如何实现线程间通信的
  8. 卸载Oracle数据库(有图有真相)
  9. Apache Mail 发送带附件的邮件
  10. java中实现方法重载怎么声明_java 接口中如何声明类似于重载的方法?
  11. 微信小程序初识到躺坑
  12. flutter 判断是不是调试模式_当永恒的软键盘问题遇到Flutter
  13. Deep Cosine Metric Learning for Person Re-Identification
  14. 拼音模糊查询+java,Java将汉语转换成拼音,用于字母的模糊查询
  15. Redis开发与运维教程
  16. k8s Storage Classes
  17. 部分彩色图片处理方式的C++实现
  18. 高中会考计算机试题及答案,高中计算机会考试题及答案
  19. Android 全埋点方案盘点
  20. 前端解放生产力之–动画(Adobe Effects + bodymovin + lottie)

热门文章

  1. mmz-asio4delphi死链接的解决办法
  2. 崔巍 计算机考研怎么样,中国科学院大学研究生导师教师师资介绍简介-崔巍
  3. c语言 unlink,unlink 漏洞笔记
  4. python操作文件夹-Python文件操作大全,随机删除文件夹内的任意文件
  5. Flask Vue.js全栈开发
  6. 关于mysql的定时任务
  7. mac 下系统目录权限问题
  8. 我在这里,等你的故事【小废回家看看】
  9. OSChina 周二乱弹 —— 最要命的编程语言?
  10. Linux命令之at