c++_ 多态

news2024/10/6 7:19:10

目录

一.多态

1.1多态(polymorphism)的概念

1.2实现多态还有两个必须重要条件:

1.3 重载 和 虚函数的重写/覆盖 和 隐藏 的比对

1.4 协变(了解)

1.5 析构函数的重写

1.6  override 和final关键字

二.纯虚函数和抽象类

三. 多态的原理

3.1虚函数表指针

3.2 虚函数表概念


一.多态
 

1.1多态(polymorphism)的概念

多态(polymorphism)的概念:多态分为 编译时多态 (静态多态 )运行时多态 (动态多态)
编译时多态 ,(静态多态) 主要就是 函数重载 和 函数模板,他们传不同类型的参数就可以调用不同的函数,通过参数不同达到多种形态。之所以叫 编译时多态(动态多态),是因为他们 实参传给形参的参数匹配是在 编译时完成的,我们把编译时⼀般归为静态,运行时归为动态。


1.2实现多态还有两个必须重要条件:

~ 第⼀必须是 基类的指针或引用,因为只有 基类的指针 或 引用 才能既指向派生类对象

~ 第二 派生类 必须对 基类 的虚函数重写/覆盖,重写或者覆盖了,派生类才能有不同的函数,多
态的不同形态效果才能达到

注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派⽣类依旧保持虚函数属性),但是该种写法不是很规范。

不规范的写法,考试容易出现

规范写法:比如

不规范的写法:比如


1.3 重载 和 虚函数的重写/覆盖 和 隐藏 的比对

虚函数的 重写/覆盖:派生类中有⼀个跟基类完全相同的虚函数(即派生类虚函数 与 基类虚函数的返回值类型函数名字参数列表完全相同),称派生类的虚函数重写了基类的虚函数。

重载 函数名字相同参数的 类型 和 个数不同  、返回值都可以。

隐藏 函数名字相同 、但不构成 重新/覆盖 。


1.4 协变(了解)


派生类重写基类虚函数时,与基类虚函数 返回值类型 不同。

1.5 析构函数的重写

基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同看起来不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统⼀处理成destructor,所以只要基类的析构函数加了vialtual修饰,派生类的析构函数就构成重写。(知道最后一句就行)


1.6  override 和final关键字
 

C++11提供了override,可以帮助用户 检测 是否 重写。


我们 不想让 派生类重写 这个 虚函数,那么可以用 final 去修饰


二.纯虚函数和抽象类

在虚函数的后⾯写上 =0 ,则这个函数为纯虚函数。纯虚函数不需要定义实现(实现没啥意义因为要被派生类重写,但是语法上可以实现),只要声明即可。纯虚函数某种程度上强制了派生类重写虚函数,因为纯虚函数,实例化不出对象。比如:

结果:


三. 多态的原理
 

3.1虚函数表指针

⼀个含有虚函数的类 中都 至少都有⼀个虚函数表指针,因为⼀个类所有虚函数的地址要
被放到这个类对象的虚函数表中,虚函数表也简称虚表。

比如:

3.2 多态的原理

每个实例化的对象,运行时都有自己的虚表,运行时到指向的对象的虚表中 确定 对应的虚函数的地址,这样就实现了 指针或引用 指向基类就调用基类的虚函数,如果 指向派生类就调用派生类 对应的虚函数。

父类的虚表地址:

子类的虚表地址:

3.2 虚函数表概念


• 基类对象的虚函数表中 存放 基类所有 虚函数的地址。
• 派生类由两部分构成继承下来的基类 自己的成员。⼀般情况下,继承下来的基类中有虚函数表指针,自己就不会再生成虚函数表指针。但是要注意的这里继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同⼀个,就像基类对象的成员和派生类对象中的基类对象成员也独立的。
• 派生类中重写的基类的虚函数,派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函数地址。生类的虚函数表中包含基类的虚函数地址派生类重写的虚函数地址派生类自己的虚函数地址 三个部分。
• 虚函数表本质是⼀个存虚函数指针的 指针数组

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

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

相关文章

黑马JavaWeb开发跟学(十一)SpringBootWeb案例

黑马JavaWeb开发跟学十一.SpringBootWeb案例 SpringBootWeb案例1. 新增员工1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 功能测试1.6 前后端联调 2. 文件上传2.1 简介2.2 本地存储2.3 阿里云OSS2.3.1 准备2.3.2 入门2.3.3 集成 3. 修改员工3.1 查询回显3.1.1 接口文档3.1…

性能测试笔记2-总

安装路径:先装jdk,后装JMeter 安装JDK: 下载JDK – 安装JDK – 配置环境变量 – 验证 安装Jmeter: 下载Jmeter – 安装Jmeter – 配置环境变量 – 启动验证 注意点: 下载JDK时,注意电脑操作系统是32位/64位 下载…

力扣 简单 110.平衡二叉树

文章目录 题目介绍解法 题目介绍 解法 平衡二叉树:任意节点的左子树和右子树的高度之差的绝对值不超过 1 //利用递归方法自顶向下判断以每个节点为根节点的左右子树的最大深度是否大于1 class Solution {public boolean isBalanced(TreeNode root) {if(root null){return tr…

Uniapp API

1.uni.showToast 显示消息提示框 unishowToast({ obj参数 }) 2.uni.showLoading 显示 loading 提示框, 需主动调用 uni.hideLoading 才能关闭提示框。 3.uni.showModal 显示模态弹窗,可以只有一个确定按钮,也可以同时有确定和取消按钮。类似于一个A…

windows上安装python环境

前言 最近电脑重装了系统,需要重新安装python环境 ,因此记录一下 1.下载 打开python官网下载,下载链接:https://www.python.org/downloads/windows/ 点击下载 ,我这里使用64位操作系统(大部分电脑),根据…

怎么查看网站是否被谷歌收录,查看网站是否被谷歌收录的简便方法

查看网站是否被谷歌收录,有多种简便方法可供选择。以下是一些常用的简便方法: 一、使用“site:”指令 打开谷歌搜索引擎: 在浏览器中打开Google.com,确保使用的是谷歌的官方搜索引擎。 输入查询指令: 在搜索框中输…

网关路由登录校验

网关过滤器 登录校验必须在请求转发到微服务之前做,否则就失去了意义。而网关的请求转发是Gateway内部代码实现的,要想在请求转发之前做登录校验,就必须了解Gateway内部工作的基本原理。 暂时无法在飞书文档外展示此内容 如图所示&#xff…

15分钟学 Python 第38天 :Python 爬虫入门(四)

Day38 : Python爬虫异常处理与反爬虫机制 章节1:异常处理的重要性 在爬虫开发过程中,网络请求和数据解析常常会遭遇各种异常。正确的异常处理可以提高程序的稳定性,避免崩溃,并帮助开发者快速定位问题。 章节2:常见…

requests案例——腾讯新闻数据的爬取

需求: 1.利用requests方法爬取该i.news.qq.com网站的数据(包括名字和对应链接) 2.实现翻页的爬取 3.将爬取下来的数据保存在excel文件中 4.利用jsonpath来解析获取的数据 5.使用openpyxl库处理 Excel 文件 注意: 1.如果报以…

一个不错的 SQL 编码风格的指南

前言 SQL语句的编写对于我们后端开发者而言是一个必备的技巧,在日常工作中,SQL语言编写的质量不仅仅会影响到团队的合作效率与项目的可维护性,还直接关系到数据库的性能优化与数据安全。今天大姚给大家分享一个不错的 SQL 编码风格的指南&am…

卡码网KamaCoder 117. 软件构建

题目来源:117. 软件构建 C题解(来源代码随想录):拓扑排序:给出一个 有向图,把这个有向图转成线性的排序。拓扑排序也是图论中判断有向无环图的常用方法。 拓扑排序的过程,其实就两步&#xff1…

Kubernetes资源详解

华子目录 1.Kubernetes中的资源1.1资源管理介绍1.2资源管理方式1.2.1命令式对象管理1.2.2kubectl常见command命令1.2.3资源类型1.2.4常用资源类型 基本命令示例运行和调试命令示例高级命令示例总结 其他命令示例create和apply区别案例显示命名空间查看命名空间中的pod如何对外暴…

数据库伸缩设计-分库分表如何做?读书笔记

一些企业内部系统,用户数量和业务规模有限,因此并不会产生巨大的数据量,这时数据库的存储和读写性能均不会成为瓶颈,没有扩容的需要,因此无须考虑伸缩性。对于一些互联网系统,前后端应用可以通过CDN 、缓存…

基于Zynq SDIO WiFi移植二(支持2.4/5G)

1 SDIO设备识别 经过编译,将移植好的uboot、kernel、rootFS、ramdisk等烧录到Flash中,上电启动,在log中,可看到sdio设备 [ 1.747059] mmc1: queuing unknown CIS tuple 0x01 (3 bytes) [ 1.761842] mmc1: queuing unknown…

vite学习教程06、vite.config.js配置

前言 博主介绍:✌目前全网粉丝3W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。 博主所有博客文件…

Meta MovieGen AI:颠覆性的文本生成视频技术详解

近年来,生成式AI技术的发展迅猛,尤其是在文本生成图像、文本生成视频等领域。Meta公司近期推出的MovieGen AI,以其强大的文本生成视频能力震撼了整个AI行业。本文将详细解读Meta MovieGen AI的核心技术、功能特性及其在实际应用中的潜力。 一…

ssrf学习(ctfhub靶场)

ssrf练习 目录 ssrf类型 漏洞形成原理(来自网络) 靶场题目 第一题(url探测网站下文件) 第二关(使用伪协议) 关于http和file协议的理解 file协议 http协议 第三关(端口扫描&#xff09…

Linux自动化构建工具Make/Makefile

make是一个命令 makefile是一个文件 touch 创建并用vim打开makefile 写入依赖对象和依赖方法 mycode是目标文件 第二行数依赖方法 以tab键开头 make makefile原理 makefile中写的是依赖关系和依赖方法 clean英语清理文件 后不用加源文件。.PHONY定义clean是伪目标。 make只…

各省份-产业链现代化水平(2001-2022年)

产业链现代化水平是一个综合性指标,它为我们提供了一个多维度的视角来评估各省份在产业链现代化进程中的发展水平。这个指标涵盖了技术创新、产业升级、生产效率、产业结构优化等多个方面,包含原始数据、测算结果以及参考文献。 2001年-2022年各省份-产…

Debezium日常分享系列之:Debezium 3.0.0.Final发布

Debezium日常分享系列之:Debezium 3.0.0.Final发布 Debezium 核心的变化需要 Java 17基于Kafka 3.8 构建废弃的增量信号字段的删除每个表的详细指标 MariaDB连接器的更改版本 11.4.3 支持 MongoDB连接器的更改MongoDB sink connector MySQL连接器的改变MySQL 9MySQL…