面向对象:多态

文章目录

    • 一、什么是多态
    • 二、构成多态的条件
      • 2.1什么是虚函数
      • 2.1如何构成虚函数的重写(原理层面上叫:重写)
      • 2.2父类指针的调用
    • 三、多态调用父类指针出现的情况
    • 四、构成多态的一种特殊情况(协变)
    • 五、析构函数构成的多态
    • 六、多态的原理
    • 七、多态的静态绑定和动态绑定
      • 7.1多态的静态绑定
      • 7.2多态的动态绑定
    • 八、单继承和多继承的虚函数表
    • 九、菱形虚拟继承
    • 十、override和final
      • 10.1override是检查派生类虚函数是否重写了基类的虚函数如果没有重写就编译报错
      • 10.2final是标明该虚函数不能重写
    • 十一、抽象类

在这里插入图片描述


先赞后看,养成习惯!!!^ _ ^<3 ❤️ ❤️ ❤️
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!
所属专栏:C++进阶
在这里插入图片描述

一、什么是多态

通俗来讲多态就是完成某一种行为,不同的对象会完成会产生不同的状态。
比如买票,针对不同的人群有不同的购票机制,对于儿童来说怎么样,对于大学生来说怎么样,这就是不同人群产生的不同状态机制
在这里插入图片描述

二、构成多态的条件

1.首先需要继承关系
2.然后就要构成虚函数的重写
3.接着需要用父类的指针或者引用去调用虚函数

2.1什么是虚函数

通过前面的虚拟继承我们得知在继承的父类前面加一个virtual就行了,那么虚函数也是如此,在普通函数前面加一个virtual就行了
在这里插入图片描述

2.1如何构成虚函数的重写(原理层面上叫:重写)

1.父类的虚函数和子类的虚函数的返回值,函数名,参数类型都必须相同
2.父类的虚函数必须加上virtual,子类可以加可以不加,不加virtual,但是返回值,函数名,参数类型都必须与父类相同,这样叫接口继承(也就是把父类的虚函数除了实现全部变成了子类的)

在这里插入图片描述

2.2父类指针的调用

在这里插入图片描述

三、多态调用父类指针出现的情况

指针指向谁就调用谁的函数
在这里插入图片描述
在这里插入图片描述
这里调用的是子类的虚函数

这里调用的是父类的虚函数
在这里插入图片描述

四、构成多态的一种特殊情况(协变)

协变构成的条件是:
父类和子类的函数的返回值不同,父类返回的是某个父类的指针,子类返回的是某个子类的指针,函数名和参数类型相同
在这里插入图片描述
在这里插入图片描述

五、析构函数构成的多态

由于编译器的特殊处理,虚函数的函数名都被处理为destructor
在这里插入图片描述

六、多态的原理

在描述原理之前,我们先看一个问题

在这里插入图片描述
这里打印的结果是多少呢?
我们首先考虑的是内存对齐的规则首先想到的肯定是8,但是这里打印的是12

在这里插入图片描述
为什么呢?我们来看看监视窗口的情况
在这里插入图片描述
这里我们发现出现了一个指针,为什么会有这个指针呢?
其实这个指针叫做虚函数表指针(虚表指针),用来存储虚函数表(虚表指针)的,也就是说虚函数的地址是存在虚函数表中的

同时也引发了另一个问题:虚函数表又是什么?
虚函数表实际上是虚函数指针数组,里面存储的是虚函数的地址,从这个地址中可以找到虚函数。

在这里插入图片描述
在这里插入图片描述

七、多态的静态绑定和动态绑定

7.1多态的静态绑定

静态绑定又称为前期绑定,也就是程序在编译的时候就已经确定了程序的行为,也称为静态多态
比如函数重载

7.2多态的动态绑定

动态绑定又称为后期绑定,也就是程序在运行的期间,根据具体拿到的类型进行确定程序的行为,调用具体的函数,也称为动态多态

八、单继承和多继承的虚函数表

这里我们需要关注的是多继承的虚函数表,因为刚刚单继承的虚函数表已经研究过了,这里不过多赘述
在这里插入图片描述
在这里插入图片描述
这里我们可以看到在监视窗口并无法观察到派生类的所有虚函数的地址情况,所以我们写一个程序来观察派生类的所有虚函数的地址
在这里插入图片描述
这里VS在每个虚函数表指针中的末尾都加了一个nullptr,我们利用这个特性打印出base中virtual func3和virtual func4存在哪一个虚表中
由于谁先继承相等于谁先声明,先声明的先打印,后继承的后打印。我们可以看到如图:
在这里插入图片描述
明显可以看出存在先声明的A中的虚表中

九、菱形虚拟继承

在这里插入图片描述
在这里插入图片描述
通过最下面的C的虚表指针的地址可以判断出A和B中的虚表指针在每个父类的第一行
在这里插入图片描述

十、override和final

10.1override是检查派生类虚函数是否重写了基类的虚函数如果没有重写就编译报错

在这里插入图片描述

10.2final是标明该虚函数不能重写

在这里插入图片描述

十一、抽象类

包含纯虚函数的类叫做抽象类,抽象类无法实例化出对象,继承了抽象类的派生类也是抽象类
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jmeter性能压测的标准和实战中会遇到的问题

1.性能标准建议 CPU 使用率&#xff1a;不超过 70% 内存使用率&#xff1a;不超过 70% 磁盘&#xff1a;%util到达80%严重繁忙 &#xff08;os.disIO.filesystem.writeKbPS 每秒写入的千字节&#xff09; 响应时间&#xff1a;95%的响应时间不超过8000ms 事务成功率&#xff1a…

EXCEL 通过FILES函数获取指定路径中的所有文件名

FILES函数 用途 获取指定文件路径中的所有文件名。 语法 FILES(“路径\*.*”)指定从哪个路径下返回一个文件名。 *.*是通配符&#xff0c;代表所有类型的文件&#xff0c;第一个*是文件名的通配符&#xff0c;第二个* 是文件的后缀名&#xff0c;表示文件类型&#xff0c;如…

【c++】简单的日期计算器

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们本节内容来完成知识的实践&#xff0c;来实现一个简易的日期计算器 目录 头文件声明函数函数的实现1.全缺省默认构…

手机真机连接USB调试adb不识别不显示和TCPIP连接问题

手机真机连接USB调试adb devices不显示设备和TCPIP连接 本文手机型号为NOVA 7 &#xff0c;其他型号手机在开发人员模式打开等方式可能略有不同&#xff0c;需根据自己的手机型号修改。 文章目录 1. 打开和关闭开发者模式2. 真机USB连接调试adb不显示设备问题的若干解决方法3…

CKS之安全沙箱运行容器:gVisor

目录 一、gVisor介绍 二、gVisor架构 三、gVisor使用前置条件 四、Docker中使用gVisor 五、containerd中使用gVisor 六、Kubernetes结合gVisor使用 一、gVisor介绍 gVisor是Google开源的一种容器沙箱技术&#xff0c;其设计初衷是在提供较高安全性的同时&#xff0c;尽量…

二十四种设计模式与六大设计原则(一):【策略模式、代理模式、单例模式、多例模式、工厂方法模式、抽象工厂模式】的定义、举例说明、核心思想、适用场景和优缺点

目录 策略模式【Strategy Pattern】 定义 举例说明 核心思想 适用场景 优缺点 代理模式【Proxy Pattern】 定义 举例说明 核心思想 适用场景 优缺点 单例模式【Singleton Pattern】 定义 举例说明 核心思想 适用场景 优缺点 多例模式【Multition Pattern】…

【2023】kafka在linux和docker安装(kafka-1)

目录&#x1f4bb; 一、linux安装kafka1. 安装jdk2. 上传解压到/usr/local目录下3、使用kafka 二、docker安装kafka1. 下载2. 安装zookeeper3. 安装kafka 一、linux安装kafka 环境主机 mac m2、虚拟机Ubuntu22.04.4 1. 安装jdk yum install -y java-1.8.0-openjdk.x86_64下载k…

.NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数

前言&#xff1a; 本次要讲的是使用.Net HttpClient拼接multipark/form-data形式post上传文件和相关参数&#xff0c;并接收到上传文件成功后返回过来的结果&#xff08;图片地址&#xff0c;和是否成功&#xff09;。可能有很多人会说用ajax不是就可以轻松的实现吗&#xff1f…

最优算法100例之16-连续子数组的最大和

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 输入一个整型数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 题…

Datacom HCIP笔记-OSPF协议 之二

链路&#xff1a;路由器之间的相连的链路 状态&#xff1a;链路上的参数在某一时刻的状态 单边邻居 one way&#xff1f; 收到对端发来的hello报文&#xff0c;其中没有自己的router id LSA类型&#xff1a; 1类LSA&#xff1a;描述路由器自身加入到ospf进程中的直连链路的状态…

wps没保存关闭了恢复数据教程

有时候我们因为电脑问题会忘记保存就关闭wps导致数据丢失&#xff0c;不知道wps没保存关闭了怎么恢复数据&#xff0c;其实数据是无法恢复的。 wps没保存关闭了怎么恢复数据 1、wps没有数据恢复功能&#xff0c;不过可以开启自动备份。 2、我们可以先点击wps左上角的“文件”…

Adaboost集成学习 | Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 股票价格预测是一个具有挑战性的时间序列预测问题,可以使用深度学习模型如双向长短期记忆…

书生·浦语全链路开源开放体系 第二期

文章目录 大模型背景大模型开发流程InternLM 2.0SFT与RLHFInternLM2主要亮点 书生浦语全链路开源开放体系数据-书生万卷InternLM-Train微调 XTuner评测工具 OpenCompass部署 LMDeploy智能体 Lagent智能体工具箱 AgentLego 大模型背景 专用模型&#xff1a;针对特定的任务&…

ChatGPT如何升级为GPT-4在国内

通过 WildCard 可以把ChatGPT升级为GPT-4 地址 1: 2155 Bailey Hill Rd 城市: Eugene 邮编: 97405 州: Oregon ChatGPT Plus/Team 一键升级&#xff0c;几分钟即可自动升级到 ChatGPT Plus。 选择我的邮箱账号符合要求 复制这个页面的链接即可 复制上面的link 到请在…

【ReadPapers】A Survey of Large Language Models

LLM-Survey的llm能力和评估部分内容学习笔记——思维导图 思维导图 参考资料 A Survey of Large Language Models论文的github仓库

适用于 Windows 的 6 个最佳视频转换器

视频转换器可以帮助您在设备上转换和播放不受支持的视频格式。它还可以方便地减小视频文件大小、以通用格式组织所有视频或与其他人共享文件以在不同设备上播放。 Windows 有大量视频转换器可供选择。虽然有些是免费的&#xff0c;但其他一些则提供迎合专业用户的高级功能。在…

深度学习pytorch——经典卷积网络之ResNet(持续更新)

错误率前五的神经网络&#xff08;图-1&#xff09;&#xff1a; 图-1 可以很直观的看到&#xff0c;随着层数的增加Error也在逐渐降低&#xff0c;因此深度是非常重要的&#xff0c;但是学习更好的网络模型和堆叠层数一样简单吗&#xff1f;通过实现表明&#xff08;图-2&…

神经网络 各个模块介绍(Pytorch 07)

一 网络层和块 单个神经网络&#xff08;1&#xff09;接受一些输入&#xff1b;&#xff08;2&#xff09;生成相应的标量输出&#xff1b;&#xff08;3&#xff09;具有一组相关 参数&#xff08;parameters&#xff09;&#xff0c;更新这些参数 可以优化某目标函数。 当…

排序第五篇 归并排序

一 简介 归并排序(Merge Sort) 的基本思想是&#xff1a; 首先将待排序文件看成 n n n 个长度为1的有序子文件&#xff0c; 把这些子文件两两归并&#xff0c; 得到 n 2 \frac{n}{2} 2n​ 个长度为 2 的有序子文件&#xff1b; 然后再把这 n 2 \frac{n}{2} 2n​ 个有序的子…

Go-React做一个todolist(服务端)【一】项目初始化

后端仓库地址 地址 项目依赖 # gin go get -u github.com/gin-gonic/gin # viper日志 go get -u github.com/spf13/viper # 数据库和gorm go get -u gorm.io/driver/mysql go get -u gorm.io/gorm # uuid go get -u github.com/google/uuid # token go get -u github.com/go…