假定多层继承的各类之间的关系如下图。假定派生类不override基类的虚函数,即Base2不override Base1中声明的虚函数vfBase1(),Base3不override Base2中声明的虚函数vfBase2(),Derived不override Base3中声明的虚函数vfBase3()。

代码如下

#include <iostream>
using namespace std;class Base1
{
public:int m_base1;inline virtual void vfBase1_1(){cout << "This is in Base1::vfBase1_1()" << endl;}
};
class Base2 : public Base1
{
public:int m_base2;inline virtual void vfBase2_1(){cout << "This is in Base2::vfBase2_1()" << endl;}
};
class Base3 : public Base2
{
public:int m_Base3;inline virtual void vfBase3_1(){cout << "This is in Base3::vfBase3_1()" << endl;}
};
class Derived : public Base3
{
public:int m_derived;inline virtual void fd(){cout << "This is in Derived::fd()" << endl;}
};
typedef void (*VFun)(void);
template<typename T>
VFun virtualFunctionPointer(T* b, int i)
{return (VFun)(*((int*)(*(int*)b) + i));
}
int main(void)
{Derived d;cout << "The size of Derived object = \t" << sizeof(Derived) << endl;cout << endl;cout << "1st virtual function table: " << endl;int i = 0;while(virtualFunctionPointer(&d, i)){VFun pVF = virtualFunctionPointer(&d, i++);pVF();}return 0;
}

运行结果:

Derived对象的memory layout图解如下:

(注意:单重继承只有一个虚函数表)

转载于:https://www.cnblogs.com/wuchanming/p/4091590.html

对象内存布局 (9)相关推荐

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

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

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

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

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

    C++对象内存布局--⑤GCC编译器--单个虚拟继承 测试GNU的GCC编译器在处理虚拟继承上跟VS不同的地方.派生类的虚函数表跟虚基类表合并. //GCC编译器--单个虚拟继承.cpp //2010 ...

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

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

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

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

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

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

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

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

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

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

  9. java char占用多少字节_Java虚拟机:Java对象大小、对象内存布局及锁状态变化

    一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法.不过还好,在JDK1.5之后引入了Instrumentation类,这个 ...

  10. JOL(java object layout --java 对象内存布局)

    JOL(java object layout --java 对象内存布局) ⚠⚠⚠本文以java普通对象为切入点,分析java的对象内存布局,数组见文末 maven地址

最新文章

  1. SAP HUM嵌套HU场景里是否可以直接对内层HU执行VLMOVE?
  2. 【读书笔记-数据挖掘概念与技术】聚类分析:基本概念和方法
  3. python官网下载步骤linux-官方下载python源码,编译linux版本的python
  4. jquery 地理位置 与 IP地址
  5. Linux信号 一 信号可靠性与分类
  6. 腾讯云数据库2020年度盛典等你来
  7. Mysql学习总结(38)——21条MySql性能优化经验
  8. Silverlight 的文本框自动完成(AutoComplete)
  9. 字符串相加和valueof_Java字符串valueOf()示例
  10. 如何在思科虚拟PC机信息进行修改
  11. 2021最新软件测试V4.0版本教程
  12. 关系抽取之分段卷积神经网络(PCNN)
  13. python之世界地图绘制_Python用 matplotlib 工具包来绘制世界地图
  14. 机器学习——k邻近算法(kNN)
  15. 电商业务中的五大机器学习问题!
  16. 数据结构实习——重言式的判别(写的不好不要见怪)
  17. 剥茧抽丝,细数模块化的前世今生
  18. java kafka设置偏移量_kafka实战宝典:手动修改消费偏移量的两种方式
  19. 高级过程控制传热自动化实训装置
  20. springboot实现高并发红包系统(java 全网最全包括语音口令 文字口令 普通 拼手气)

热门文章

  1. 前台传参到后台出现中文乱码问题
  2. C#知识点:操作XML
  3. 使用 Jenkins + GitHub + Nginx + HTTPS 搭建静态网站
  4. SimpleDateFormat 类的总结
  5. UI设计师经常去的五个网站
  6. Delphi Android下包含第三方DEX
  7. 【转】如何更改VS2005的启动环境
  8. [转]installshield for VC++6 如何使用
  9. HDU6464 (权值线段树)-(查找区间第k1小于第k2小之间的和)
  10. 【常见错误】--Nltk使用错误