如何解决多继承下的 菱形继承 问题
目录
概念:
菱形虚拟继承:
概念:
此时D类属于多继承,可以看到D类里面会有两份A类的数据,菱形继承也并不一定就一定就是上图的菱形,假如B类下面还有一个类,D类继承它,同样也是菱形继承问题
class A
{
public:int a;
};class B : public A
{
public:int b;
};class C : public A
{
public:int c;
};class D : public B, public C
{
public:int d;
};int main()
{D data;cout << data.a << endl;return 0;
}
大家觉得这段代码有问题嘛?
我们此时D类已经出现了数据冗余和二义性的问题了,我们直接访问 a 的值是不可行的,只有明确地表明你要访问地是哪个类里面的 a
class A
{
public:int a;
};class B : virtual public A
{
public:int b;
};class C : virtual public A
{
public:int c;
};class D : public B, public C
{
public:int d;
};int main()
{D data;cout << data.a << endl;return 0;
}
不过可以在腰部,也就是 B和C 类加上 virtual ,就可以数据二义性的问题和数据冗余,这个叫 菱形虚拟继承
菱形虚拟继承:
class A
{
public:int a;
};//class B : virtual public A
class B : public A
{
public:int b;
};//class C : virtual public A
class C : public A
{
public:int c;
};class D : public B, public C
{
public:int d;
};int main()
{D data;//data.a = 1;data.B::a = 2;data.C::a = 6;data.b = 3;data.c = 4;data.d = 5;return 0;
}
我们来看一下上述代码运行完,在内存的角度观察他们的变化:
能够看的出,总共分为三个部分:上面两个框分别是B和C类的,谁先继承谁就在上面,并且,数据a 也是独立开来的,B里面a = 2;C里面a = 6 。
再来看加了virtual后的又会是什么样的变化:
同样也是分为了三个部分,先继承的类就在上面,所以上面两个分别是B和C类,但这次不一样的是:
数据a并没有分开来,而是在最下面去了,相代替的是一个指针,这个指针指向的是一个虚基表,这个表里面存放着一个偏移量,当我们要进行 切割 的时候,获取 数据a 就通过当前的这个指针 + 这个偏离量就能找到了。(这个表叫虚基表,指针叫虚基表指针)
如果此时定义一个B对象,它的里面同时也有一个续集表指针,指向一个自己的续集表,这个偏移量 和 D定义出来的 对象 里的 B类的虚基表里的偏离量不同
如图所示:左边是B类定义出来的对象;右边是D类定义出来的对象。
他们都有各自的虚基表指针,这个指针是不一样的!!!!里面的偏移量也是!!
相关文章:
如何解决多继承下的 菱形继承 问题
目录 概念: 菱形虚拟继承: 概念: 此时D类属于多继承,可以看到D类里面会有两份A类的数据,菱形继承也并不一定就一定就是上图的菱形,假如B类下面还有一个类,D类继承它,同样也是菱形继承问题 cla…...
rk3288-android8.1-以太网ethernet和蓝牙Bluetooth
遇到一个现象,以太网和蓝牙打不开 经过不断分析和查找发现问题在.config中 CONFIG_MOTORCOMM_PHYy 会导致以太网的eth0注册不成功(现在是双网口,还有个USB网卡) 改成# CONFIG_MOTORCOMM_PHY is not set 后以太网可以正常 # CONFIG_RTC_DRV_RK808 is not set 会导致蓝牙打不…...
算法比赛——必备的数论知识
秋名山码民的主页 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 🙏作者水平有限,如发现错误,还请私信或者评论区留言! 目录一、欧几里得二、扩展欧几里得三、算术基本定理四、线性筛选求质数五…...
Docker概述
什么是Docker我们要学习在Linux(RockyLinux)中安装使用Docker来配置软件的功能Docker是一个用来开发、运输和运行应用程序的开放平台。使用Docker可以将应用程序与基础结构分离,以便快速交付软件。使用Docker,您可以以管理应用程序的方式管理基础架构。通…...
实验室设计建设方案主要内容
实验室设计建设整体解决方案SICOLAB需要综合考虑实验室的功能需求、空间布局、设备选型、安全防护、节能环保等多方面因素。以下是一个基本的实验室设计建设方案的流程:一、需求分析:了解实验室的使用目的、实验内容、使用人数、设备种类、实验标准等&am…...
华为OD机试真题Python实现【日志采集系统】真题+解题思路+代码(20222023)
日志采集系统 题目 日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。 如果上报太频繁,会对服务端造成压力; 如果上报太晚,会降低用户的体验; 如果一次上报的条数太多,会导致超时失败。 为此,项目组设计了如下的上报策略: 每成功上…...
Python的模块与工具包
模块 模块是一个Python文件,以 .py结尾。模块能定义函数,类和变量,模块里也能包含可执行的代码。 作用 python 中有很多各种不同的模块,每一个模块都可以帮助我们快速的实现一些功能,比如实现和时间相关的功能就可以…...
联合熵和条件熵
本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:information-theory】,需要的朋友们自取。或者公众号【AIShareLab】回复 信息论 也可获取。 文章目录联合熵条件熵联合…...
华为OD机试真题Python实现【求最大数字】真题+解题思路+代码(20222023)
求最大数字 题目 给定一个由纯数字组成以字符串表示的数值,现要求字符串中的每个数字最多只能出现2次,超过的需要进行删除;删除某个重复的数字后,其它数字相对位置保持不变。 如34533,数字3重复超过2次,需要删除其中一个3,删除第一个3后获得最大数值4533 请返回经过删…...
Python爬虫(10)selenium爬虫后数据,存入csv、txt并将存入数据并对数据进行查询
之前的文章有关于更多操作方式详细解答,本篇基于前面的知识点进行操作,如果不了解可以先看之前的文章 Python爬虫(1)一次性搞定Selenium(新版)8种find_element元素定位方式 Python爬虫(2)-Selenium控制浏览…...
Python 之 Pandas 时间函数 time 、datetime 模块和时间处理基础
文章目录一、time 模块1、时间格式转换图2. struct_time 元组元素结构3. format time 结构化表示二、datetime 模块1. date类2. 方法和属性3. datetime 类三、timedelta 类的时间加减四、时间处理基础Python 中提供了对时间日期的多种多样的处理方式,主要是在 time …...
C语言学习及复习笔记-【5】C 运算符
文章目录5. C 运算符5.1 关系运算符5.2 逻辑运算符5.3 位运算符5.4 杂项运算符 ↦ sizeof & 三元5.5 例子1). 利用异或 ^ 来交换两个数的值,而且不引入其他变量。2). 利用位与 & 运算,判断一个整数是否是2的整数次幂。3). 不同长度的数据进行位运…...
数仓、数据湖、湖仓一体、数据网格
第一代:数据仓库 定义 为解决数据库面对数据分析的不足,孕育出新一类产品数据仓库。数据仓库(Data Warehouse)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策和信息的全局共享。 数…...
C语言【atoi函数】
C语言【atoi函数】🫅系统atoi函数🫅 模拟实现atoi函数看到atoi函数,有人又会问有这个函数,我怎么没用过。那就说明:不是你刷题太少,就是atoi函数存在感太低。 这篇函数就带你领略atoi函数的魅力 Ǻ…...
一起学习用Verilog在FPGA上实现CNN----(八)integrationFC设计
1 integrationFC设计 LeNet-5网络结构全连接部分如图所示,该部分有2个全连接层,1个TanH激活层,1个SoftMax激活层: 图片来自附带的技术文档《Hardware Documentation》 integrationFC部分原理图,如图所示,…...
面试题总结
1.js的数据类型 分为基本数据类型和引用数据类型。 基本数据类型 ES5的5种:Null,undefined,Boolean,Number,String, ES6新增:Symbol表示独一无二的值 ES10新增:BigInt 表示任意大的…...
go进阶(1) -深入理解goroutine并发运行机制
并发指的是同时进行多个任务的程序,Web处理请求,读写处理操作,I/O操作都可以充分利用并发增长处理速度,随着网络的普及,并发操作逐渐不可或缺 一、goroutine简述 在Golang中一个goroutines就是一个执行单元ÿ…...
mongodb 操作记录
#启动服务 net start MongoDB #停止服务 net stop MongoDB #进入mongo shell 方式 mongo db #查看当前数据库是那个 #插入一条数据 db.runoob.insert({x:10}) #查找数据 db.runoob.find() 查询所有的数据库 show dbs #连接mongodb mongodb://[username:password]host1[:po…...
JDBC简单的示例
JDBC 编程步骤 加载驱动程序: Class.forName(driverClass) //加载MySql驱动 Class.forName("com.mysql.jdbc.Driver") //加载Oracle驱动 Class.forName("oracle.jdbc.driver.OracleDriver")获得数据库连接: DriverManager.getCon…...
Spring架构篇--2.3 远程通信基础--IO多路复用select,poll,epoll模型
前言:对于传统的BIO(同步阻塞)模型,当有客户端连接达到服务端,服务端在对改连接进行连接建立,和数据传输过程中,是无法响应其他客户端的,只有当服务端完成对一个客户端处理后&#x…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
