一、虚拟菱形继承

#include <iostream>
using namespace std;class B {
public:int _b;
};class C1 :virtual public B {
public:int _c1;
};class C2 :virtual public B {
public:int _c2;
};class D :public C1, public C2 {
public:int _d;
};int main()
{cout << sizeof(D); //24return 0;
}

二. 虚拟菱形继承

测试代码:

#include <iostream>
using namespace std;
struct A
{A(int v = 100) : X(v) {};virtual void foo(void) {}int X;
};struct B : virtual public A
{B(int v = 10) :Y(v), A(100) {};virtual void fooB(void) {}int Y;
};struct C : virtual public A
{C(int v = 20) :Z(v), A(100) {}virtual void fooC(void) {}int Z;
};struct D : public B, public C
{D(int v = 40) :B(10), C(20), A(100), L(v) {}virtual void fooD(void) {}int L;
};int main()
{A a;int* ptr;ptr = (int*)&a;cout << ptr << " sizeof = " << sizeof(a) << endl;for (int i = 0; i < sizeof(A) / sizeof(int); i++){if (ptr[i] < 10000){cout << dec << ptr[i] << endl;}elsecout << hex << ptr[i] << " = " << hex << *((int*)(ptr[i])) << endl;}cout << "--------------------------------------" << endl;B b;ptr = (int*)& b;cout << "addr:" << ptr << " sizeof = " << sizeof(b) << endl;for (int i = 0; i < sizeof(B) / sizeof(int); i++){if (ptr[i] < 10000){cout << dec << ptr[i] << endl;}elsecout << hex << ptr[i] << " = " << hex << *((int*)(ptr[i])) << endl;}cout << "--------------------------------------" << endl;D d;ptr = (int*)& d;cout << "addr:" << ptr << " sizeof = " << sizeof(d) << endl;for (int i = 0; i < sizeof(D) / sizeof(int); i++){if (ptr[i] < 10000){cout << dec << ptr[i] << endl;}elsecout << hex << ptr[i] << " = " << hex << *((int*)(ptr[i])) << endl;}return 0;
}

输出结果:

参考资料

  • 图说C++对象模型:对象内存布局详解
  • 从内存布局看C++虚继承的实现原理
  • C++继承内存对象模型

【C++ Priemr | 15】虚函数表剖析(三)相关推荐

  1. 【C++ Priemr | 15】虚函数表剖析(二)

    一.多重继承(无虚函数覆盖) 下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系.注意:子类并没有覆盖父类的函数. 测试代码: class Base1 { public: virtu ...

  2. 【C++ Primer | 15】虚函数表剖析(一)

    一.虚函数 1. 概念 多态指当不同的对象收到相同的消息时,产生不同的动作 编译时多态(静态绑定),函数重载,运算符重载,模板. 运行时多态(动态绑定),虚函数机制. 为了实现C++的多态,C++使用 ...

  3. 虚函数表剖析,网上转的,呵呵

    http://www.cppblog.com/xczhang/archive/2008/01/20/41508.html C++虚函数表解析(转) C++中的虚函数的作用主要是实现了多态的机制.关于多 ...

  4. 虚函数与虚函数表剖析(动多态)

    探索C++虚函数在g++中的实现 本文是我在追查一个诡异core问题的过程中收获的一点心得,把公司项目相关的背景和特定条件去掉后,仅取其中通用的C++虚函数实现部分知识记录于此. 在开始之前,原谅我先 ...

  5. C++ 虚函数详解(虚函数表、vfptr)——带虚函数表的内存分布图

    前言 总所周知,虚函数是实现多态的基础. 引用或指针的静态类型与对象本身的动态类型的不同,才是C++支持多态的根本所在. 当使用基类的引用或指针调用一个虚函数成员时,会执行动态绑定. 所有的虚函数都必 ...

  6. 深入剖析C++多态、VPTR指针、虚函数表

    在讲多态之前,我们先来说说关于多态的一个基石------类型兼容性原则. 一.背景知识 1.类型兼容性原则 类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代.通过公有继承,派 ...

  7. C++多态:多态实现原理剖析,虚函数表,评价多态,常见问答与实战【C++多态】(55)

    虚函数表 一般继承(无虚函数覆写) 一般继承( 有虚函数覆写) 静态代码发生了什么 评价多态 常见问答与实战 问答 为什么虚函数必须是类的成员函数? 为什么类的静态成员函数不能为虚函数? 为什么构造函 ...

  8. 图解C++虚函数 虚函数表

    图解C++虚函数 2016年07月02日 17:47:17 海枫 阅读数:5181 标签: 虚函数c++g++对象模型C++虚函数更多 个人分类: C/C++/linux 版权声明:本文为博主原创文章 ...

  9. C++虚函数表解析 (Lawliet 修改+注释版)(附有部分网友的重要评论)

    C++ 虚函数表解析   2008-11-14 作者:陈皓 来源:csdn     前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型的指针指向其子类的实例,然后通过父 ...

最新文章

  1. volatile怎么实现的内存可见?附面试题答案
  2. python怎么将if和try一起用_Python使用try/catch还if效率更高一些?
  3. 10 操作系统第二章 进程管理 死锁、死锁的处理策略 银行家算法
  4. python下载包突然卡住_【python】python下载视频为什么会卡?
  5. 网络口协商_以太网端口协商原理
  6. 设计一个方法,可以实现任意范围内的随机数
  7. 怎么看神经网络过早收敛_遗传算法的收敛性分析
  8. Db4o数据库:细说查询
  9. 机器视觉可以应用到哪些场景中?
  10. noip2005 篝火晚会
  11. 计算机信息管理员笔试面试题,网络管理员笔试题目
  12. Maven常用命令_飘云羽逸_新浪博客
  13. 【转】GB2312汉字分区及内码表
  14. 《关键对话》思维导图
  15. Windows Metro Style颜色色值表
  16. 不允许一个用户使用一个以上用户名域一个服务器或共享
  17. 大学生月入过万的创业好项目——自媒体
  18. 增强 扫描王 源码_OpenCV探索之路(二十二):制作一个类“全能扫描王”的简易扫描软件...
  19. Android 拖动条 和 Handle
  20. Win11电脑睡眠后无法唤醒

热门文章

  1. 新学了一个用python编写的简单的百度贴吧帖子的爬虫
  2. HTTP 错误500.19 -Internal Server Error
  3. cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面
  4. 关于varchar2在pl/sql和schema级别的最大值
  5. antd 表格树如何展开_如何分析工作,找出规律,使用excel大幅度提高工作效率...
  6. c++ for循环 流程图_python 零基础必知--条件控制与循环语句
  7. batchplot插件用法_Batchplot批量打印怎么用?Batchplot批量打印教程
  8. python控件随窗口变化而适配_Tkinter窗口/控件比例调整
  9. 按钮图片拉伸_图片墙有多香?高手都在用的PPT封面制作技巧!
  10. 前向验证对于模型的更新作用