c++ 多层继承分析

C++知识积累:继承关系(含虚函数)下类的内存布局 目录 1 无继承 2 一般继承 2.1 单继承 2.2 多层继承 2.3 多重继承 2.4菱形继承 3 虚继承 3.1 虚继承的布局 3.2 虚继承的多层继承 3.3 虚继承的菱形继承 总结 1 无继承 类A定义如下: class A { private: int A_1; public: static int A_2; int A_3; ... 阅读详情

(1)首先我们考虑一个(非虚拟)多重继承的相对简单的例子。看看下面的C++类层次结构:

注意Top被继承了两次(在Eiffel语言中这被称作重复继承)。

这意味着类型Bottom的一个实例bottom将有两个叫做a的元素(分别为bottom.Left::a和bottom.Right::a)

那么Buttom 在内存中是如何存储的呢:编译器建议如下(当然也可以Right放在Left上面呢 如图):

下面开始测试:

     首先:

 接着测:如果我们提升Bottom指针,会发生什么事呢?

如果 再

 

原因就在于:(肯定是暗箱操作的 暂时不想追究了 下面“参考”) 如图 (注意访问域 一定是继承之间共有的可以访问)

是的,什么也没有。这条语句是有歧义的:编译器将会报错。

是的,什么也没有。这条语句是有歧义的:编译器将会报错。

(二)多继承(虚拟继承)

//首先:@https://www.cnblogs.com/jin521/p/5602190.html  //http://blog.youkuaiyun.com/stay_the_course/article/details/55259801

 

参考:1:http://blog.youkuaiyun.com/stay_the_course/article/details/55259801

  2:https://www.cnblogs.com/malecrab/p/5572730.html

3:https://www.cnblogs.com/jin521/p/5602190.html

4:http://blog.youkuaiyun.com/cmm0401/article/details/66472391

5:插入什么是多态:https://www.cnblogs.com/liujinhong/p/6003144.html

6:https://www.cnblogs.com/Daywei/p/5865342.html

7:汇编:https://www.cnblogs.com/lxgeek/archive/2011/01/01/1923738.html

 

虚继承和虚函数是完全无相关的两个概念。

虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题,通常可以将派生类对象的地址赋值给基类对象,实现的具体方式是,将基类指针指向继承类(继承类有基类的拷贝)中的基类对象的地址,但是多重继承可能存在一个基类的多份拷贝,这就出现了二义性。

虚继承可以解决多种继承前面提到的两个问题:

虚继承底层实现原理与编译器相关,一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承时,虚基类指针也会被继承。

实际上,vbptr指的是虚基类表指针(virtual base table pointer),该指针指向了一个虚基类表(virtual table),虚表中记录了虚基类与本类的偏移地址;通过偏移地址,这样就找到了虚基类成员,而虚继承也不用像普通多继承那样维持着公共基类(虚基类)的两份同样的拷贝,节省了存储空间

 

 

 

虚基类表存储的是虚基类相对直接继承类的偏移;而虚函数表存储的是虚函数地址。

 

理解虚继承:虚继承不同于真正的继承,多个派生类虚继承同一个基类,如图

 

 

菱形继承时:

转:c++ 对象模型:https://www.cnblogs.com/raichen/p/5744300.html

内存布局(看编译器)如下图:

访问被重复继承的基类时:如上图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ue4 角色奔跑/冲刺/蹲下 /蹲走 动作切换蓝图 序列:文章分为4部分: 一、准备工作+简单的蓝图连线 二、编写“行走” 混合空间 三、编写“蹲下”混合空间 四、合成2个动画,设置动画蓝图 —————————————— 一、准备工作 下载“动画初学者包”,添加到项目! 主要文件: 打开BP_playerCharacter,组价——添加组件,找到“摄像机”,“机臂” 没有找到就去其他项目复制过来 ———————————— 手写人物的移动,也可以在... 阅读详情

相关推荐

WRF气象建模实战:如何为JRA55非标准数据定制Vtable文件?

本文详细介绍了为WRF气象模型定制Vtable文件以支持JRA55非标准数据(特别是积雪数据)的完整实战流程。文章深入解析了WPS数据流中Vtable的核心映射逻辑,提供了从GRIB文件诊断、Vtable编写到METGRID.TBL调优的通用方法论,帮助用户解决非标准气象数据源适配的关键技术挑战。

c8d9e0f1的博客 673

C++多重继承

那么,D 是多重继承的派生类,它以公有继承方式继承A类,以私有继承方式继承B类,以保护继承方式继承C类。基类出现的顺序为A, B, C,那么,先调用基类A的构造函数,再调用基类B的构造函数,然后,调用基类C的构造函数,最后,再调用派生类D的构造函数。在软件开发过程中,很多情况下,一个派生类有多个基类,此时,派生类继承多个基类,称为:多重继承(multiple inheritance)。所以,执行构造函数的过程也是先执行类A构造函数,再执行类B构造函数,最后,执行类C构造函数。3 多重继承派生类的构造函数。

LC的专栏 603

软件测试工程师最常用的Linux系统命令大全(汇总)

cd命令这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。

1330

C+多继承中存在的问题

C+中多继承中菱形继承引发的问题和解决方案

广西彭于晏的博客 1567

构建高可用CephFS NFS网关:NFS-Ganesha与RADOS集群的深度整合

本文详细介绍了如何构建高可用的CephFS NFS网关,通过NFS-Ganesha与RADOS集群的深度整合,实现高效文件共享。文章涵盖核心架构、部署实战、性能调优及避坑指南,帮助用户解决Ceph客户端兼容性问题,提升存储访问效率。特别强调高可用设计,确保服务稳定性,适用于金融、电商等高要求场景。

weixin_26976635的博客 254

飞塔防火墙CVE-2022-40684漏洞复现:手把手教你搭建靶场环境(附调试技巧)

本文详细指导如何搭建Fortinet飞塔防火墙CVE-2022-40684认证绕过漏洞的靶场环境,涵盖虚拟机部署、网络配置、调试模式开启及漏洞原理分析。通过手把手教程,读者可掌握漏洞复现与深度调试技巧,深入理解该认证绕过漏洞的利用与防御。

h6i7j8的博客 695

多重继承的优点和缺陷

多重继承在语言上并没有什么很严重的问题,但是标准本身只对语义做了规定,而对编译器的细节没有做规定。所以在使用时(即使是继承),最好不要对内存布局等有什么假设。此类的问题还有虚析构函数等。为了避免由此带来的复杂性,通常推荐使用复合。但是,在《C++设计新思维》(Andrei Alexandrescu)一书中对多重继承和模板有极为精彩的运用。 (1)多重继承本身并没有问题,如果运用得当可以收到事半功...

用通俗的语言讲述严谨的科学方法 5406

脑机接口最新发展动态报告 (2024-2025)

脑机接口动态

高山 4105

C++多重、多层、分层继承

在本文中,您将学习C ++编程中的不同继承模型:带有示例的多继承,多层和分层继承。是面向对象编程语言的核心功能之一。它允许软件开发人员从现有的类派生一个新的类。派生类继承基类(现有类)的功能。C ++编程中有多种继承模型。

xinxin的博客 722

5种隐藏代码到图片的实用技巧:从Notepad++到Linux命令全解析

本文详细解析了5种将代码或文本隐藏到图片中的实用数据隐写技巧。从Notepad++尾部追加、Windows命令行合并,到编辑图像元数据、使用十六进制编辑器,再到Linux的cat/dd命令,全面覆盖了从图形界面到命令行的工程化实践方法,帮助开发者和安全研究人员掌握隐蔽信息传输与存储的核心技术。

hh234的博客 353

RK3588-NANOPC-T6移植ubuntu+xenomai内核

更具网址下载相应的内核。导入到开发板并执行内核。

qq_42007446的博客 572

C++ 对象间的继承关系(赋值兼容规则)

C++ 通过类派生 的机制来支持继承。被继承的类称为基类 ,新产生的类为派生类 或子类,基类和派生类的集合 称作类继承层次结构。

qq_63282188的博客 2178

【OpenClaw从入门到精通】第45篇:Skill供应链安全——如何识别并避开恶意技能插件?(2026实测版)

随着OpenClaw生态爆发式增长,全球Skills总量近75万个,日均新增2.1万个,但恶意/问题插件已超600个,数十万用户受影响。本文基于奇安信威胁报告及360安全实践,拆解恶意技能的五大核心特征,提出"安装前三步法"安全审查流程,详解安全技能来源白名单与定期审计方案,并深度解析360龙虾Skill安全超市的分级认证机制。读者可掌握从技能筛选、安装审查到术后审计的全流程安全防护手段,通过实操命令与案例演示,零成本构建Skill供应链安全防线,避免遭遇私钥窃取、资产损失等安全事件。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 561

C++笔记(面向对象)继承 多层继承 同名隐藏

摘要:继承是面向对象编程中的重要机制,允许派生类获取基类的属性和方法,实现代码复用与多态。文章详细讲解了继承的三种方式(public/protected/private)、构造/析构顺序,以及多重继承带来的菱形问题。重点分析了同名屏蔽现象:派生类成员会隐藏基类同名成员(变量和函数),可通过作用域解析符或using声明访问被隐藏成员。文章还比较了继承(is-a)与组合(has-a)的关系差异,并通过存储布局示例说明派生类对象的内存结构。最后通过多层继承示例展示了构造/析构的调用顺序。

似流水般平静而坚定。 720

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++多层继承与多重继承父类指针转换以及注意事项

无论是多层继承还是多重继承,都支持父类指针指向子类对象(向上转型),这是多态的基础。多层继承的核心注意事项是:虚析构、成员访问范围、向下转型安全性。多重继承需额外关注:成员二义性、菱形继承的虚继承解决、指针地址偏移问题。合理使用父类指针可以简化代码(如用统一的父类指针容器管理不同子类对象),但需根据继承结构的复杂性针对性规避风险。

u010632343的博客 1056

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

多层继承与多重继承

概念对比,概念对比,多重继承,private 继承对多层继承的影响,不同继承方式对后续继承的影响对比

KouFiee的博客 168

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

c++继承—逆向分析

c++继承的本质 假设有三个类,并给他们分别赋值 看反汇编的情况 换成c++中继承的方式 在看看反汇编,可以发现与普通写法效果一样的 多层继承,给Z的对象依次赋值 在内存中,三个结构的示意图 总结 ...

z1041259928的博客 600

反汇编分析之:继承,多重继承,多层继承,父子类指针本质

谈面向对象语言不能不谈继承,这也是面向对象语言天生的优势,大大提高了代码的复用,在c语言中我们也可以通过结构体嵌套的方式,来实现继承,倘若看本c++的书,一个继承都能来来回回讲个几十回合。我们通过反汇编来看看继承的本质究竟是什么? 一:继承                                                                         1、不继承...

张飞online博客 946

C++--继承

1.继承机制:是类型层次结构设计中实现代码的复用重要手段2.派生:保持原有类特性的基础上进行扩展,增加新属性和新方法,从而产生新的类型再面向对象程序设计中,继承和派生是构造出新类型的过程,呈现类型设计的层次结构,体现了程序设计人员对现实世界由简单到复杂的认识过程。3.C++通过派生的机制来支持继承,被继承的类称为基类或超类,新产生的类为派生类或子类。基类和派生类的集合称作类继承层次结构4.总结:派生反映了事物之间的联系,事务的共性与个性之间的关系。

better_ztw的博客 994

针对初学者的C和C++23的对比学习-11.继承

针对初学者的C和C++23的对比学习-11.继承 旨在帮助有一定C语言基础,且想要学习C++23标准相关规则的初学者,提供笔记和帮助

weixin_46424672的博客 1047

C++面向对象——继承、派生与多态

两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。C++提供虚基类(virtual base class )的方法,使得在间接继承共同基类时只保留一份成员(在内存中只有基类成员的一份拷贝),通过把基类继承声明为虚拟的,就只能继承基类的一份拷贝,从而消除歧义。当一个基类被继承为不同的派生类时,各派生类可以使用与基类成员相同的成员名,如果运行时使用同一成员名调用对象的成员,会调用哪个对象的成员?

爱思考的小伙 1817

面向对象——继承(c++)

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础,上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构。体现了由简单到复杂的认识过程。百度百科(继承)通过继承(inheritance)的机制可对类(class)分层,提供类型/子类型的关系。C++通过类派生(classderivation)的机制来支持继承。被继承的类称为基类(baseclass)或超类(superclass),新产生的类为。......

weixin_48560325的博客 3287

C++继承构造函数

继承构造函数是C++11引入的实用特性,核心价值是简化派生类对基类构造函数的复用,减少代码冗余。语法:通过using 基类::基类;声明;范围:不继承拷贝/移动构造函数;派生类成员:继承的构造函数默认初始化额外成员;冲突处理:派生类自定义构造函数会覆盖同名参数的继承版本;多继承:需避免不同基类构造函数的参数歧义。继承构造函数的核心价值是简化派生类对基类构造逻辑的复用,但并非所有场景都适用。下面结合具体场景和代码示例,详解其典型使用场景及适用条件。

C/C++ 660

C++虚继承

【代码】C++9月4日作业。

zww66620020914的博客 358

掌握C++ using声明的4个核心规则,告别继承链断裂危机

掌握C++继承中的using声明核心规则,解决派生类重载函数隐藏问题。涵盖公有继承、构造函数继承等场景,详解4大关键用法与优势,避免接口断裂。代码清晰易维护,值得收藏。

InitPulse的博客 407

继承与派生(c++)

public:///类内声明int c, d;Son::Son(int a, int b, int tc, int td) :Base(a, b) { ///类外定义派生和继承是C++非常重要的特性,它避免了重复性编程,使软件的重用成为了肯。

xiaoyuuoo的博客 901
上一篇: C++ 多继承和虚继承的内存布局(转)
下一篇: c++ satic const
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值