虚继承--内存布局

c++虚继承对象的内存布局 c++虚继承对象的内存布局               --VC7.1特别版网上关于c++对象布局的文章挺多,而且《深度探索c++对象模型》(Inside The C++ Object Model 侯捷 译)一书中也很详细地介绍。如果你一点都不了解C++对象的布局,我推荐你看看《深度探索c++对象模型》的第三章,如果你意犹未尽下面的两个系列都很不错:一是陈皓的《C++ 对象的内存布 阅读详情
#include<iostream>
#include<memory.h>
#include<assert.h>

using namespace std;
class A
{
    char k[3];
public:
    A()
    {
        k[0]='1';
        k[1]='2';
        k[2]='3';
    }
    virtual void aa()
    {
        cout<<"this is A->aa()"<<endl;
    };
};
class B : public A
{
    char j[3];
public:
    B()
    {
        j[0]='4';
        j[1]='5';
        j[2]='6';
    }
    virtual void bb()
    {
        cout<<"this is B-bb()"<<endl;
    };
};
class C:public B
{
    char i[3];
public:
    C()
    {
        i[0]='7';
        i[1]='8';
        i[2]='9';
    }
    virtual void cc()
    {
        cout<<"this is C->cc()"<<endl;
    };
};


int main()
{
    A a;
    B b;
    C c;
    typedef void(*fun)(void);
    fun pf=NULL;
    pf=(fun)*((int *)*(int *)(&a));
    pf();//this is A->aa()
    pf=(fun)*((int*)*(int *)(&b));
    pf();
    pf=(fun)*((int*)*((int *)(&b))+1);
    pf();//this is B->bb()
    pf=(fun)*((int*)*((int*)(&b)+3));
    pf();//this is A->aa()
    pf=(fun)*((int*)*(int *)(&c));
    pf();//this is A->aa()
    pf=(fun)*((int*)*((int *)(&c))+1);
    pf();//this is B->bb()
    pf=(fun)*((int*)*((int *)(&c))+2);
    pf();//this is C->cc();
    pf=(fun)*((int*)*((int*)(&c)+4));
    pf();//this is A->aa()
    pf=(fun)*((int*)*((int*)(&c)+4)+1);
    pf();//this is B->bb()
    cout<<"sizeof (A)"<<sizeof(A)<<endl; //8
    cout <<"sizeof(B)"<<sizeof(B)<<endl; //12
    cout<<"sizeof(C)"<<sizeof(C)<<endl;  //16

    return 0;
}
/******** 内存结构图 ******/
/****
&a 8 字节
0x22ff18: 98 2b 47 00 31 32 33 7f | 00 60 fd 7f 00 00 00 00
0x22ff28: 68 ff 22 00 b6 10 40 00 | 01 00 00 00 38 10 64 00
&b 16 字节
0x22ff0c: a8 2b 47 00 31 32 33 34 | 35 36 65 00 98 2b 47 00
0x22ff1c: 31 32 33 7f 00 60 fd 7f | 00 00 00 00 68 ff 22 00
&c 24 字节
0x22fefc: 62 11 e8 75 bc 5b ed 75 | 80 33 41 00 28 ff 22 00
0x22ff0c: a8 2b 47 00 31 32 33 34 | 35 36 65 00 98 2b 47 00


***/

C++ 内存布局 - Part6: 虚继承 虚继承可以在菱形继承体系中,防止派生类中有多份重复祖基类内容。如下图所示,如果是常规继承,Class Final中会有两份Class Base的内容。通过虚继承,即Derived1 虚继承自Base, Derived2 也虚继承自Base, 那么Final中将最终保留一份Base部分的内容。 阅读详情

相关推荐

C++ 虚函数/虚继承内存布局

1 前言 1.1 多态 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 多态分为静态多态和动态多态。 (1)静态多态:是发生在编译期,是一种早绑定。通过函数重载和泛型编程实现。 (2)动态多态:是发生在运行期,是一种晚绑定。通过虚函数实现。 注意以下函数不能是虚函数: (1)普通函数(非类成员函数) (2)静态函数 ...

路漫漫其修远兮 783

C++ 虚继承以及内存布局

文章目录什么时候用到虚继承虚基类的初始化虚基类的成员调用几种虚继承虚继承与访问控制的关系几个问题看一个例子,观察虚继承对象内存结构reference 本篇源码部分来自clang,部分来自《C++程序设计语言 4th》的21章。 本篇是在学/复习虚继承的相关概念,发现这个一般用不到的概念还是有很多东西没有理解了的。 什么时候用到虚继承 有的时候,在类设计上,将数据、接口放在了基类中,就可能会产生了菱形继承结构。比如: class Storable { public: Storable(const st

刘国元的专栏 797

【车辆仿真】从0开始建立dSPACE RT Simulink工程:CAN通信(RTICANMM方法)

【工程环境信息】:本文基于链接文章搭建SCALEXIO Rack RTPC总线节点,用于与AutoBox通信硬件:上位机:惠普台式PC(Windows 11专业版)下位机(实时机):AutoBox (DS1006)板卡:DS6342软件:本文所使用的DBC链接提示:以下是本篇文章正文内容,下面案例可供参考!!!的部分一定记得配置,其他的按需配置RTICANMM的灵活度非常高,尽可能参考Help文档,理解相应的配置内容官方有RTICANMM的样例工程,在下方路径。

winnizap的博客 2384

虚继承及继承的内存布局

1.为什么需要虚继承 如下图所示如果访问Der::Fun or Der::m_nValue就会带来二义性,无法确定是调用Base1的还是Base2的,所以为了解决多重继承情况下成员访问的二义性,引入了虚继承机制。 一般继承: 虚继承: 2.虚继承实现 在虚继承下,Der通过共享虚基类SuperBase来避免二义性,在Base1,Base2中分别保存虚基类指针,Der继承Base1,Base...

sunweiliang的博客 381

华为鸿蒙系统也能用!5分钟搞定谷歌三件套安装(附最新APK下载链接)

本文为华为鸿蒙系统用户提供了一份详尽的谷歌三件套(Google Play服务、商店及框架)手动安装指南。文章核心在于无需Root,通过ADB命令获取设备信息,并从可靠来源下载匹配版本的APK,按照正确顺序安装,从而解决海外应用依赖问题,实现5分钟快速部署。

c7d8e9的博客 6558

从频谱入手搞定ESD:手把手教你用示波器和频谱仪分析静电干扰(以Type-C接口为例)

本文详细介绍了如何利用示波器和频谱仪分析Type-C接口的ESD干扰问题。通过频谱特性分析、耦合路径诊断和实战测试,提供了一套完整的ESD防护方案,包括三级防护设计和器件选型建议,帮助工程师有效解决静电放电导致的系统故障。

weixin_42662293的博客 348

从内存布局看C++虚继承的实现原理

虚继承实现原理

qq_39824315的博客 229

恶意代码实验3:Word宏病毒实验

只要下次打开这个word文档,就会执行以上代码,并将自身复制到Normal.dot(word文档的公共模板)和当前文档的ThisDocument中,同时改变函数名(模板中为Document_Close,当前文档为Document_Open),此时所有的word文档打开和关闭时,都将运行以上的病毒代码,可以加入适当的恶意代码,影响word的正常使用,本例中只是简单的跳出一个提示框。回答不正确三次,即可自动跳出病毒程序,但那时已经出现几十个文档。1、打开的宏编辑器如图所示,即可编写病毒代码。

qq_63949327的博客 6506

虚继承内存布局,构造顺序

转自:http://www.cnblogs.com/ziolo/archive/2013/05/07/3066022.html 一直疑惑虚继承与虚函数并存时类的内存结构,下面的文章虽然格式乱但是值得细细品味,我在vs2010下查看了下类的内存结构,除了没有“0x00000000  // 虚基类的非虚基类的分隔符”外,内存结构基本与文中所述一样,另外补充一下虚基类的非虚基类A的偏移地址由8

433

Lisflood

文献:基于SWMM和LISFLOOD-FP模型的居住区低影响开发模拟评价。问题:多个节点溢流同时,不行,待解决。目录下,cmd命令行。

警警的博客 2664

支付宝域名如何加入白名单(扫码老是弹窗)

支付宝扫码之后,遇到非支付宝官方网页,请确认是否继续访问弹窗,问题解决办法。本章教程提供解决办法,亲测有效。

猿小白的博客 9199

【C++拾遗】 从内存布局看C++虚继承的实现原理

准备工作 1、VS2012使用命令行选项查看对象的内存布局 微软的Visual Studio提供给用户显示C++对象在内存中的布局的选项:/d1reportSingleClassLayout。使用方法很简单,直接在[工具(T)]选项下找到“Visual Studio命令提示(C)”后点击即可。切换到cpp文件所在目录下输入如下的命令即可       c1 [filename].cpp

上善若水,人淡如菊 2万+

YOLOv11改进策略【Head】| AFPN渐进式自适应特征金字塔,增加针对小目标的检测头(附模块详解和完整配置步骤)

一、本文介绍 本文利用AFPN对YOLOv11的网络模型进行优化提升。AFPN采用渐近式融合及自适应空间融合操作。通过渐近式架构,逐步整合不同层级特征,有效避免非相邻层级间因语义差距过大导致的信息丢失或降级问题,确保在多尺度特征融合过程中既能保留高层语义信息,又能融入低层细节特征。本文将AFPN应用于YOLOv11中,并配置了针对小目标的检测头,能显著增强模型对不同尺度目标的检测能力,使其在复杂场景下更聚焦于目标物体特征,减少背景等无关信息的影响。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、

Limiiiing的博客 2718

C++在gcc下的单继承,多继承,虚继承的内存布局

一览本文目的gcc下不同继承方式的存储模型单继承单继承无重写:单继承重写多重继承多继承无重写:多继承重写:虚继承多重继承无法解决的模型真正的菱形继承尾语 本文目的     最近看了《深入探索c++对象模型》,被其中关于虚函数的各种继承的内存结构,绕来绕去,十分纠结。并且在《深入探索c++对象模型》这本书中的的各种结构是大体的策略,可以用来理解,但是gcc编译器中的具体实现比较详细。而网...

Lupin 3057

基于STM32的浴室环境智能控制系统设计

摘要:本文设计了一款基于STM32F103的智能卫浴系统,通过多传感器协同检测浴室环境参数。系统采用DS18B20检测环境与卫浴温度,DHT11监测湿度,MQ-135检测空气质量,光敏电阻测量光照强度,D203S人体热释电模块检测人员存在。当检测到异常参数时,系统自动启动相应调节功能:温度异常时控制加热/制冷继电器,湿度过高时启动通风除湿,空气质量差时进行换气,光照不足且有人时自动开灯。系统支持按键、蓝牙APP和语音三种控制方式,可手动设置参数阈值、切换防雾模式、控制音乐播放等功能。实验结果表明,该系统能有

3254968421的博客 485

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++ 虚继承对象内存布局

摘要:本文详细解析了C++虚继承的内存布局机制。虚继承通过虚基表指针(vbptr)和虚基表(vbtable)实现共享虚基类,解决菱形继承的二义性问题。关键点包括:1)虚基类子对象始终位于派生类内存末尾;2)每个虚继承类含有一个vbptr指向偏移量表;3)与虚函数表指针(vptr)的区别;4)32/64位系统的布局差异。文章通过代码示例展示了简单虚继承和菱形继承的内存结构,并总结了构造顺序、访问规则等面试常见考点。虚继承以指针空间和间接访问为代价,消除了数据冗余。

doubleintfloat的博客 348

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

c++虚继承对象的内存布局(修改版)

c++虚继承对象的内存布局(修改版)               网上关于c++对象布局的文章挺多,而且《深度探索c++对象模型》(Inside TheC++ Object Model 侯捷译)一书中也很详细地介绍。如果你一点都不了解C++对象的布局,我推荐你看看《深度探索c++对象模型》的第三章,如果你意犹未尽下面的两个系列都很不错: 一是陈皓的《C++ 对象的内存布局》图文并貌,

lingfengtengfei的专栏 1524

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【C++11】 从内存布局看C++虚继承的实现原理

转载自:http://blog.youkuaiyun.com/xiejingfa/article/details/48028491 准备工作 1、VS2012使用命令行选项查看对象的内存布局 微软的Visual Studio提供给用户显示C++对象在内存中的布局的选项:/d1reportSingleClassLayout。使用方法很简单,直接在[工具(T)]选项下找到“Visual Studio命...

realzuile的博客 610

C++虚继承的实现方式与内存布局

虚基类表中存放了虚基类的成员在派生类内存空间中的偏移量......

hujing_Liu 2473

【C++】虚继承——菱形继承问题(内存布局图解)

【C++】虚继承——菱形继承问题(内存布局图解) (这一块的内容给出七个例子来理解~有问题的话可以评论留言哟) 先给出一段含有虚继承的代码: #include&lt;iostream&gt; using namespace std; class A { public: A(int a):ma(a){} public: int ma; }; class B:virtu...

VVVv_0427的博客 2293

详解多态、虚继承、多重继承内存布局及虚表(C++)

详解C++多态、虚继承、多重继承内存布局,及虚函数表,虚表指针。

一枚菜鸡 2970

多重继承和虚继承的内存布局,超级…

这篇文章主要讲解虚继承的C++对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别、虚函数表的格式等一些大部分C++程序员都似是而非的概念。原文见这里(By Edsko de Vries, January 2006)           敬告: 本文是介绍C++的技术文章,假定读者对于C++有比较深入的认识,同时也需要一些汇编知识。    本文我们将阐释G

路漫漫其修远兮,吾将上下而求索 1411

虚继承 虚基类的子类内存布局

1、普通多继承的内存布局 class A { public: int dataA; }; class B : public A { public: int dataB; }; class C : public A { public: int dataC; }; class D : public B, public C { public: int dataD; }; B类的内存...

Y~哈哈哈的博客 615

虚继承的内存布局

下面这个函数的输出结果是什么? #include<iostream> using namespace std; class A // 4+4 = 8 { public: int a; virtual void p() {} }; class B :virtual public A // 8 + 4 + 4 = 16 { public: int b; virt...

m0_37313888的博客 193
上一篇: explicit
下一篇: 单例模式
Dark_Passion
博客等级 码龄17年 14粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值