C++的继承以及virtual的底层实现

news2024/11/26 10:24:58

1.继承的基本形式

1.还是举每次讲继承都会举得一个例子:老师和学生都有人类的共同信息----姓名,性别,身份证等等,而学生有学工号,课表。老师有上班时间等等,所以在类中就有了继承这一说,子类继承父类。

2.基本形式就是:

比如,你用proctected继承的话,你就不可以切片了,就相当于父类=子类,可以复制一下下面的代码就会发现问题所在了。

2.子类强转父类,切片/切割

1.证明切片是直接切片,而不是和其他强转类型一样,先弄一个临时变量。

我有写过其他类型强转的问题,可以看一下。

C++中引用“&”的权限问题_Qianxueban的博客-CSDN博客

怎么证明呢,那就是用C++的引用的权限可以平移缩小,但不可以放大来观察。

因为临时变量产生具有常性,所以不可以引用,除非加const,让权限是平移。

2.继承的作用域

1.遇到相同的函数名或变量

1.函数名中的形参不一样,但依旧不会函数名重载,依旧会冲突。

3.派生类的默认成员函数吗、

举个构造函数的例子,其他的可以使用我的例子,一个个的尝试。

4.继承中的单继承和多继承

1.多继承引发的菱形继承问题

1.菱形继承会发生什么情况呢?

我感觉我不说,大家也能猜出来会出现什么情况了,它的A这个基类他不唯一了,所以肯定会发生奇异了。

很明显报错了

2.怎么解决菱形继承的问题

在继承父类的时候加上virtual就可以了:

3.virtual在底层是怎么解决这个问题的呢?

1.我们看一下对比你就会发现了,

先看一下没有virtual的程序内存中是如何存储的。

再看一下加了virtual是如何存储的:

相当于它不存储A中的_a了,而是存储内存的偏移量了。那有些人会问了,为什么不存储这些,代码运行内存,运行到最后就知道是A的这个基类了,但是你忘了上面讲的切片,他只有一小段的内容了,他就判断不出来A这个类的位置了,所以万万不可。(中间有ccccc的其实是编译器的配置,上面把x64改成x86就没有了。)

那为什么不直接存储A的指针呢, 可能设计到后面的多态,作者这边也还在学习中哈。

5.继承和组合

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

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

相关文章

UMA 2 - Unity Multipurpose Avatar☀️五.如何使用别人的Recipe和创建自己的服饰Recipe

文章目录 🟥 使用别人的Recipe1️⃣ 导入UMA资源效果展示2️⃣ 更新Library3️⃣ 试一下吧🟧 创建自己的服饰Recipe1️⃣ 创建自己的服饰Recipe2️⃣ 选择应用到的Base Recipe3️⃣ 指定显示名 / 佩戴位置 / 隐藏部位4️⃣ 给该服饰Recipe指定Slot / Overlay🚩 赋予Slot�…

【洛谷 P1105】平台 题解(结构体排序+枚举)

平台 题目描述 空间中有一些平台。给出每个平台的位置,请你计算从每一个平台的边缘落下之后会落到哪一个平台上。注意,如果某两个平台的某个两边缘横坐标相同,物体从上面那个平台落下之后将不会落在下面那个平台上。平台可能会重叠。 如果…

springboot 异常 #Class path contains multiple SLF4J bindings.警告解决

1.异常现象 启动 Maven 项目时,抛出警告信息: 2.排查分析 从报出来的警告信息来看,大致意思是,pom.xml 引入的包 slf4j-log4j12-1.7.20.jar 和包 logback-classic-1.1.7.jar 中,都找到了 /org/slf4j/impl/StaticLogger…

Arrays.copyOf 和System.arraycopy?深拷贝和浅拷贝?

Arrays.copyOf 和 System.arraycopy 1)二者有何不同? System.arraycopy()方法 System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length); 需主动创建目标对象dest可定义起始元素,灵活拷贝元素比较重要的一点&…

TCP IP网络编程(五) 基于TCP的服务器端、客户端 (补充)

文章目录 回声客户端的完美实现回声客户端出现的问题回声客户端问题解决方法 TCP原理TCP套接字中的I/O缓冲TCP内部工作原理1:与对方套接字的连接TCP内部工作原理2:与对方主机的数据交换TCP内部工作原理3:断开与套接字的连接 总结 回声客户端的…

CRM软件管理系统的基本功能

CRM管理系统是企业运营的重要工具,它可以帮助企业管理客户关系,提升销售效率,大幅提高客户转化率,实现业绩增长。那么,CRM管理系统一般包含哪些功能呢?下面我们就来说说。 1、销售自动化 销售自动化顾名思…

【面试专题】Spring篇②

📃个人主页:个人主页 🔥系列专栏:Java面试专题 目录 1.spring-bean的循环依赖 2.springMVC执行流程 3.Springboot自动配置原理 4.Spring框架常见的注解(Spring,SpringMVC,SpringBoot&#x…

Ubuntu编译运行socket.io

本篇文章记录一下自己在ubuntu上编译运行socket.io的过程,客户端选用的是socket.io的c的库,编译起来倒不难,但是说到运行的话,对我来说确实是花了点功夫。毕竟程序要能运行起来才能更方便地去熟悉代码,因此今天我就记录…

MySQL——日志

日志的作用 1.用来排错 2.用来做数据分析 3.了解程序的运行情况,是否健康--》了解MySQL的性能,运行情况 分类 mysql很多有类型的日志,按照组件划分的话,可以分为 服务层日志 和 存储引擎层日志 : - 服务层…

数据治理-数据建模和设计

是什么? 数据建模是发现、分析和确定数据需求的过程,用一种称为数据模型的精确形式表示和传递这些数据需求。数据建模是数据管理的一个重要组成部分。建模过程中要求组织发现并记录数据组合的方式。 数据可以采用多种不同的模式来表示,其中最…

【广州华锐互动】电厂三维数字孪生大屏的功能和优势

在工业互联网的背景下,电厂三维数字孪生大屏系统正在逐渐成为电力行业的重要技术。通过创建电厂的虚拟模型,这个数字孪生系统可以实现对实际电厂的实时监控,预测维护需求,优化运营效率,甚至在某些情况下,能…

CrossEntropyLoss() 和 nn.BCEWithLogitsLoss() 举例说明区别

CrossEntropyLoss() 通常用于多分类任务,它接受一个包含类别标签的张量作为目标值,并且假设每个样本只属于一个类别。在多分类任务中,模型的最后一层输出是一个概率分布,表示每个类别的概率。CrossEntropyLoss() 计算模型输出与目…

微信“刷掌支付”上线,扫手就可以付款!你知道怎么开通了吗?

不用扫码!不用刷卡!隔空感应! 刷掌就能支付 没错! 新科技来咯~ 刷 掌 早在今年5月,微信刷掌支付正式面世,目前已应用于交通、健身、校园、零售、餐饮、办公、共享充电等多个场景,如北京地铁…

vue3+ts项目打包后的本地访问

注意:打包之后不可直接点击html访问,需要给项目安装本地服务! 1、安装servenpm i -g serve 2、打包项目npm run build 生成dist文件夹 3、本地访问serve dist 运行service dist之后的控制台 可复制下方的地址运行打包后的项目,运行…

Spring系列文章:Spring中的设计模式

一、简单⼯⼚模式 BeanFactory的getBean()⽅法,通过唯⼀标识来获取Bean对象。是典型的简单⼯⼚模式(静态⼯⼚模 式); 二、⼯⼚⽅法模式 FactoryBean是典型的⼯⼚⽅法模式。在配置⽂件中通过factory-method属性来指定⼯⼚⽅法&a…

英语单词(二)

1.int:整形 2.char:字符型 3.scanner:接受输入,扫描器 4.integer:整数,整形 5.type:类型 6.string:字符串类型 7.double:双精度浮点型

OpenRoads地形模型添加(增补)地形点

创建三维点,将创建的点对象添加到现有地形模型。 在ORD建模工作流: 地形、分析、点、分析点,在需要添加点的位置读出地模的高程(图1); 图1 几何、平面、点添加高程点,特征设为地形随机点、高…

双线性插值以及计算

参考视频:图像处理-双线性插值_哔哩哔哩_bilibili 双线性插值 双线性插值是一种常用的图像处理和计算机图形学技术,用于在离散像素网格上平滑地估算介于两个相邻像素之间的数值。这种插值方法通常用于图像放大、旋转和变换等操作,以改善图像…

操作系统 第二章 进程管理:进程与线程、处理机调度

目录 1.进程与线程 1.1进程的概念、组成、特征 1.1.1概念 1.1.2组成 进程控制块(PCB) 程序段 数据段 1.1.3特征 1.2进程的状态与转换 1.2.1进程的五种状态 1.2.2进程的状态转换 1.3进程控制 1.3.1如何实现原语的“原子性” 1.3.2进程的创建…

intellij debug模式提示 : Method breakpoints may dramatically slow down debugging

最近在搞一个搭建一个项目 , 项目搭建完之后发现启动不了 , 一直都是正在加载中 并且提示Method breakpoints may dramatically slow down debugging,百度之后才知道是打了方法断点的原因 , 之前不小心打了一个断点 解决办法 : 点击如下图所示的按钮 然后把有断点…