[c++]菱形继承解析

菱形继承

  • 大概示意图:

菱形继承不一定只是标准的菱形,只要形似菱形的都可以叫菱形继承。


(以下说明都是默认公有继承,public和protected成员情况下)
菱形继承会造成数据的冗余和二义性:

  • 冗余:一个Assitant对象里面有两个Person的成员(如果成员是_name,那么就会有两个_name)
  • 二义性:如果用Assitant对象取访问_name,会报错(编译器不确定访问哪一个_name

为了处理这种情况,祖先就开发并使用了虚继承

  • 我们使用更简便的例子取讲解虚继承具体是怎么取处理的:举例用的

在这里插入图片描述
虚拟继承之后发现: _a变成唯一的了,并且将_a放在了D对象组成的最下面
这时候有小伙伴就会问了,那编译器怎么取访问_a呢?而且75c和764(上图中地址的后缀)存放的又是什么呢?

  • 75c和764里面的指针就是编译器找到那个唯一_a的途径 ;75c存放的地址位置指向一个叫虚基表的东西,所以B和C中存放对应地址的指针就叫虚基表指针;
  • 虚基表里面存放着一种叫偏移量的东西,简单来说:偏移量里面第二行存放的是,当前指针(虚基表指针)与对象底部_a之间的地址距离。1

简图解释如下:便于和上面相通,读者们可将A和Person视作同一个类在这里插入图片描述
到这里有同学可能就会提问:那如果A(Person)里有更多的成员变量呢?那是不是虚基表里面会存更多的偏移量?

  • 事实上并不会哦,只需要存储A类型中首个声名的成员变量的偏移量即可,找到首个后,编译器自然就会向下访问下面的成员变量。

**有同学可能会问,为什么使用虚拟继承之后,对象内占用的空间变多了? **

  • 实际上这是因为A类太小了造成的错觉,加入A类中的成员函数增加到更多个,那么再虚拟后占用就会就会清晰可见的减少:在这里插入图片描述
  • 证明多个成员变量都是存在对象的底部:在这里插入图片描述

  1. 75c到_a(所继承A的首个成员地址)的地址770之间差了20 (16进制下是显示的是14) ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java(今日总结

今天测试了一下set和map package a0427.Classes;import java.util.HashSet; import java.util.Set;public class shuzu {public static void main(String[] args) {Set<String> set new HashSet(10);set.add("aaa");set.add("bbb");set.add("c…

详细分析PyInstaller打包python为exe执行文件(附Demo)

目录 前言1. 基本知识2. Demo 前言 需要将python文件打包成exe文件&#xff0c;变成rpa自动化形式 1. 基本知识 PyInstaller是一个用于将Python应用程序打包成独立可执行文件的工具 可以将Python脚本打包成Windows、Linux和Mac OS X上的可执行文件&#xff0c;这个作用可以将…

ThingsBoard远程RPC调用设备

使用 RPC 功能 客户端 RPC 从设备发送客户端 RPC 平台处理客户端RPC 服务器端 RPC 服务器端RPC结构 发送服务器端RPC 使用 RPC 功能 ThingsBoard 允许您从服务器端应用程序向设备发送远程过程调用 (RPC)&#xff0c;反之亦然。基本上&#xff0c;此功能允许您向设备发送命…

华为FusionCompute简介

华为FusionCompute 8&#xff08;通常简称为FC8&#xff09;是华为推出的一款云操作系统软件&#xff0c;其主要功能和作用包括&#xff1a; 1. **硬件资源虚拟化**&#xff1a;FusionCompute通过虚拟化技术&#xff0c;将物理服务器的计算、存储和网络资源抽象化&#xff0c;…

Python 数组控件的使用

当一个UI窗口界面内有多个相同类型的控件&#xff0c;且这多个控件的功能都类似时&#xff0c;使用数组控件是一个非常不错的选择&#xff0c;可以大大减少代码的编写 且 代码易读性强&#xff0c;可惜的是Python好象是没有数组控件这个东东。 我们来看看以下一个界面&#xff…

Linux:服务器硬件及RAID配置

文章目录 Linux&#xff1a;服务器硬件及RAID配置服务器服务器是什么服务器的结构 RAID硬RAID与软RAID对比RAID级别介绍RAID 0RAID 1RAID 5RAID 6RAID 10 RAID级别对比 配置RAID硬RAID软RAID Linux&#xff1a;服务器硬件及RAID配置 服务器 服务器是什么 服务器的英文名称为…

Linux进程概念(六):进程控制

目录 进程创建 fork函数 进程终止 终止时干了什么 进程终止的三种情况 main函数的返回值 打印默认退出码 自定义退出码 总结 进程终止 exit函数 _exit函数 exit和_exit的区别 进程等待 什么是进程等待 为什么要有进程等待 wait函数 waitpid函数 阻塞等待与…

Redis技术总结

1.基本数据结构,底层原理,以及应用 String 底层使用了SDS简单动态字符,string一共三种编码方式,int,embstr,raw int主要存储long型整数 string有两个数据结构redisObject和SDS embstr和raw底层sds,主要区别是embstr的redisobject和sds连续存储在一起,而redisobject和s…

环形链表——java

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

Axure实现tab页面切换功能

1. 实现效果 2. 实现原理 创建两个标签&#xff0c;并实现点击时选中状态点击时&#xff0c;设置面板状态 3. 实现步骤 3.1 实现可切换的标签 在页面上拖拽两个矩形作为两个tab标签&#xff0c;并命名 tab1 和 tab2 设置每个矩形的边框显示&#xff0c;只显示下边框即可 …

C#反射应用

1.根据类名名称生成类实例 CreateInstance后面的参数部分一定要和所构造的类参数数量对应&#xff0c;即使设置参数默认值&#xff0c;也不可省略。 2.只知道类名&#xff0c;需要将该类作为参数调用泛型接口。 3.只知道类名&#xff0c;需要将该类的数组作为参数调用泛型接口…

LeetCode刷题之删除重复元素

文章目录 1.删除数组中的重复元素1.1 描述1.2 分析1.3 解答 2. 删除有序数组中的重复元素2.1 描述2.2 分析2.3 解答 1.删除数组中的重复元素 题26、删除数组中的重复元素 1.1 描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0…

顺序查找和折半查找

顺序查找&#xff1a; 对于无序的情况&#xff1a; 什么是顺序查找&#xff1a;顺序查找的实现方式&#xff08;存储&#xff09;&#xff0c;是含有两种的方式进行存储的&#xff0c;一种是顺序表的形式进行存储&#xff0c;还有一种是使用链表的形式进行存储的。采用顺序查…

架构师系列- 消息中间件(15)-kafka业务实战

7.1 顺序性场景 7.1.1 场景概述 假设我们要传输一批订单到另一个系统&#xff0c;那么订单对应状态的演变是有顺序性要求的。 已下单 → 已支付 → 已确认 不允许错乱&#xff01; 7.1.2 顺序级别 1&#xff09;全局有序&#xff1a; 串行化。每条经过kafka的消息必须严格…

Swift中TableView的下拉刷新和上拉加载

在Swift中&#xff0c;可以使用UIRefreshControl来实现TableView的下拉刷新。首先&#xff0c;需要在ViewDidLoad方法中创建一个UIRefreshControl的实例&#xff0c;并添加到TableView的subview中。然后&#xff0c;设置refreshControl的action为TableView的下拉刷新函数&#…

windows SDK编程 --- 消息之键盘消息(4)

前置知识 一、 键盘消息 在Windows操作系统中&#xff0c;键盘消息是用来通知应用程序有关键盘输入事件的一种机制。当用户在键盘上进行操作&#xff0c;比如按键或释放键时&#xff0c;Windows会生成相应的消息并发送给处理这些输入的应用程序。这些消息对于开发图形用户界面…

ElasticSearch教程入门到精通——第二部分(基于ELK技术栈elasticsearch 7.x+8.x新特性)

ElasticSearch教程入门到精通——第二部分&#xff08;基于ELK技术栈elasticsearch 7.x8.x新特性&#xff09; 1. JavaAPI-环境准备1.1 新建Maven工程——添加依赖1.2 HelloElasticsearch 2. 索引2.1 索引——创建2.2 索引——查询2.3 索引——删除 3. 文档3.1 文档——重构3.2…

react,Chart

一、基础图&#xff1a;https://ant-design-charts.antgroup.com/ Ant Design Charts 1. 首先要下载ant-design/charts&#xff0c;然后在页面中添加如下柱状图代码: import React from react; import { Column } from ant-design/chartsconst DemoColumn: React.FC () …

Grafana- bug- User sync failed - User already exists

Grafana security release: New versions of Grafana with a critical security fix for CVE-2023-3128 Vardan Torosyan • 22 Jun, 2023 • 4 min Today we are releasing Grafana 10.0.1, 9.5.5, 9.4.13, 9.3.16, 9.2.20, and 8.5.27. Alongside other bug fixes, these pa…

百度智能云千帆 ModelBuilder 技术实践系列:通过 SDK 快速构建并发布垂域模型

​百度智能云千帆大模型平台&#xff08;百度智能云千帆大模型平台 ModelBuilder&#xff09;作为面向企业开发者的一站式大模型开发平台&#xff0c;自上线以来受到了广大开发者、企业的关注。至今已经上线收纳了超过 70 种预置模型服务&#xff0c;用户可以快速的调用&#x…