【C++打怪之路Lv14】- “多态“篇

🌈 个人主页:白子寰
🔥 分类专栏:重生之我在学Linux,C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

 

目录

1.什么是多态?

2.多态的构成条件

 1)多态的构成条件

2)什么是虚函数?

3)什么是虚函数的(覆盖/重写)?

虚函数重写的两个例外

①协变(了解)

②析构函数的重写 

区别(不构成多态就是隐藏)

 目的

参数列表(签名)要求

访问控制

多态性

c++11 override 和 final

 override

final 

 重载、覆盖(重写)、隐藏(重定义)的对比

重载

重写(覆盖)

重定义(隐藏)

抽象类

 概念

 多态的原理

虚函数表(虚表)

动态绑定与静态绑定

动态绑定

静态绑定

总结

多态的特点 

多态调用 VS 普通调用


 

1.什么是多态?

概念:多种形态

具体来说:不同的对象去做同一个行为,结果不同(不同的人做同一件事情有不同的结果)
举个例子:
①不同的人去买票:成人买成人票;学生买学生票
②不同的动物叫,会产生不同的叫声



2.多态的构成条件

        1)多态构成条件

        2)什么是虚函数?

        3)什么是虚函数的 覆盖 / 重写

            虚函数的(覆盖/重写)有什么特征?

 1)多态的构成条件

        ①虚函数的重写

重写它的实现,基类和派生类最好都加上virtual

        ②父类指针或引用调用虚函数

父类一定要加virtual,子类可加可不加(最好加上)


2)什么是虚函数?

        有virtrual修饰的类成员函数

①virtual在函数的返回值前加
②只能用来非静态的成员函数,不能用来修饰全局函数


3)什么是虚函数的(覆盖/重写)?

没有virtual修饰的类成员函数

虚函数的(覆盖/重写)有什么特征?

        有三同(函数名,返回值类型,函数类型参数)

重写是特殊的隐藏 


虚函数重写的两个例外

①协变(了解)

基类和派生类虚函数返回值类型不同


 

②析构函数的重写 

基类与派生类析构函数名字不同


区别(不构成多态就是隐藏)

 目的

隐藏是为了在派生类中使用相同名称的成员,而与基类中的成员区分开来。
重写是为了在运行时能够根据对象的实际类型来调用正确的函数版本,实现多态。

参数列表(签名)要求

隐藏不要求签名相同,名称相同即可。
重写要求签名必须相同。

访问控制

隐藏可以发生在任何访问修饰符下,不需要基类成员是虚函数。
重写要求基类中的函数必须是虚函数,且通常情况下,重写的函数访问修饰符不能比基类中的更严格。

多态性

隐藏不会影响多态性。
重写是实现多态的必要条件


c++11 override 和 final

 override

在派生类参数列表后面加检查有没有重写


final 

修饰虚函数表示该虚函数不能再被重写

        也可以修饰类,在父类名称后+final(表示它的子类不能继承这个父类)
不能被继承的方法:父类的构造函数变成私有


 重载、覆盖(重写)、隐藏(重定义)的对比

重载

两个函数在同一作用域

函数名相同,参数不同

重写(覆盖)

两个函数分别在基类和派生类的作用域

三同

两个函数必须是虚函数

重定义(隐藏)

重写也是一种特殊的隐藏

两个函数分别再基类和派生类的作用域

函数名相同

两个基类和派生类的同名函数不构成重写就是重定义



抽象类

 概念

包含纯虚函数的类叫抽象类

纯虚函数:在函数的参数列表后 + "=0"

不能实例化出对象

只有重写纯虚函数,才能实例化出对象



 多态的原理

为什么虚函数要放进虚表?

在虚表(函数指针数组)里面找对应函数,指向谁调用谁

虚函数表(虚表)

算字节时对齐后多算4个字节(86位情况下)【因为多了一个指针】
本质上是个指针数组
虚表在常量区代码段,
虚函数跟普通函数一样放在代码段,
虚表指针在对象里面

动态绑定与静态绑定

动态绑定

1.符合多态
2.被重写了是在不同的虚函数表里

静态绑定

不符合多态,编译时绑定,跟指向的对象无关

 



 

总结

多态的特点 

看指向对象指向谁调用谁(指向哪个对象就调用哪个对象的虚函数)

多态调用 VS 普通调用

①多态调用,看指向对象类型,指向谁调用谁的虚函数
②普通调用,看调用者的类型,调用调用者的函数

注:

本篇文章所说的是动态的多态

静态的多态通过函数重载或函数模板调用(在编译时确定)



 

***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“做自己人生的福尔摩斯”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。

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

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

相关文章

Github 2024-11-05 Python开源项目日报Top10

根据Github Trendings的统计,今日(2024-11-05统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10HTML项目1TypeScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…

如何从 Android 图库中恢复误删除的照片

如果您正在阅读这篇文章,那么您肯定意外地从 Android 设备中删除了照片。并且您正在寻找一种简单的方法来恢复 Android 图库中已删除的照片。 从图库恢复已删除的照片 随着技术的进步,现在使用单个设备(即 Android 手机)&#xf…

ESP-HaloPanel:用 ESP32-C2 打造超低成本智能家居面板

项目简介 在生活品质日益提升的今天,智能家居系统已经走进了千家万户,并逐渐成为现代生活的一部份。与此同时,一款设计精致、体积轻盈、操作简便的全屋智能家居控制面板,已经成为众多家庭的新宠。这种高效、直观的智能化的解决方…

人工智能:重塑未来的力量

华为OD机试 2024E卷题库疯狂收录中,刷题 点这里。 实战项目访问:http://javapub.net.cn/ 人工智能技术的未来:变革与适应 引言 随着人工智能技术的不断发展,我们已经看到了它在各行业带来的巨大变革。从医疗行业的病例诊断到企业…

3D看车如何实现?有哪些功能特点和优势?

3D看车是一种创新的汽车展示方式,它基于网络世界,融合了三维建模与虚拟现实技术,为消费者带来前所未有的真实、立体观车体验。以下是对3D看车的详细解释: 一、3D看车的实现方式 高精度三维建模: 通过高精度三维建模…

消息队列的测试点

消息队列的测试点 一、常用的消息队列产品1、挑战性问题 二、kafka简介三、消息的生产四、消息的存储五、Kafka的特性六、kafka测试要点 一、常用的消息队列产品 基于内存的消息队列 RabbitMQ:适用于处理高并发场景,广泛用于即时消息传递RabbitMQ&…

web实操1——只使用tomcat发布网站

安装tomcat 下载 肯定是去官网: http://tomcat.apache.org/ 下载之后,解压: !!解压后: logs日志:就是一些输出,输到文本里。 temp:一些临时文件(不用管) webapps:放网站的 work&…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十七集:制作第二个BOSS燥郁的毛里克

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作游戏第二个BOSS燥郁的毛里克 1.导入素材和制作相关动画1.5处理玩家受到战吼相关行为逻辑处理2.制作相应的行为控制和生命系统管理3.制作战斗场景和战斗…

HarmonyOS开发 - 餐饮APP中多门店多窗口打开实例补充

specified启动模式为指定实例模式,有一些特殊场景,例如多门店应用中每次打开一个门店都希望能新建一个门店实例,而重复打开同一个门店都是同一门店实例。 此篇为餐饮APP中多门店实例的补充内容,以解决同一门店多次点击重复创建新窗…

FreeRTOS 13:FreeRTOS队列的读原理

队列读取消息 FreeRTOS 中用于从队列中读取消息的 API 函数如下表所示: xQueueReceive BaseType_t xQueueReceive( QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait ) {BaseType_t xEntryTimeSet pdFALSE;TimeOut_t xTimeOut;Queue_t * con…

山东路远生态科技有限公司竣工投产仪式暨产品发布会圆满举行

第二十届三中全会于2024年7月15日至18日在北京举行。全会审议通过了《关于进一步全面深化改革、推进中国式现代化的决定》。其中提到,“要健全因地制宜发展新质生产力体制机制”。 新质生产力是由技术革命性突破、生产要素创新性配置、产业深度转型升级而催生的当代先进生产力…

Vue + Vant Picker实现省市区三级联动

一、picker选择器的数据由columns属性控制,columns中有几个元素就代表该选择器有多少级,通过change方法来给对应列赋值 this.columns [{values: citys,className: "column1",defaultIndex: 0,flex: 1, //控制每列的宽度},{values: citys[0].…

[java][高级]FilterListenerAjax

Filter&Listener&Ajax 目标: 能够使用 Filter 完成登陆状态校验功能 能够使用 axios 发送 ajax 请求 熟悉 json 格式,并能使用 Fastjson 完成 java 对象和 json 串的相互转换 1,Filter 1.1 Filter概述 Filter 表示过滤器&#…

如何使用RabbitMQ和Python实现广播消息

使用 RabbitMQ 和 Python 实现广播消息的过程涉及设置一个消息队列和多个消费者,以便接收相同的消息。RabbitMQ 的 “fanout” 交换机允许你将消息广播到所有绑定的队列。以下是如何实现这一过程的详细步骤。 1、问题背景 在将系统从Morbid迁移到RabbitMQ时&#x…

java.lang.IllegalArgumentException: argument type mismatch问题排查汇总

java.lang.IllegalArgumentException: argument type mismatch 错误通常发生在方法调用时,传入的参数类型与方法签名中声明的参数类型不匹配,错误发生在堆栈跟踪中,MyBatis 反射调用方法设置 Bean 属性时。 以下是一些可能的原因和解决方法…

沉浸式学习新体验:3D虚拟展厅如何重塑教育格局!

3D虚拟展厅对于教育行业产生了深远的影响,主要体现在以下几个方面: 一、创新教学方式 3D虚拟展厅利用三维技术构建的虚拟展示空间,为教育行业带来了一种全新的教学方式。传统的教学方式往往局限于书本和课堂,而3D虚拟展厅则能够…

第107篇:国*攻防比赛中一个多层嵌套的java内存马的反混淆解密分析过程

Part1 前言 大家好,我是ABC_123。一年一度的“大型攻防比赛”已经过去2、3个月了,在此期间陆续收到了多名网友发来的内存马样本,ABC_123一直在抽时间进行分析解密工作。现在很多的内存马都进行了加密混淆,而且一个比一个复杂&…

火山引擎云服务docker 安装

安装 Docker 登录云服务器。 执行以下命令,添加 yum 源。 yum update -y yum install epel-release -y yum clean all yum list依次执行以下命令,添加Docker CE镜像源。更多操作请参考Docker CE镜像。 # 安装必要的一些系统工具 sudo yum install -y yu…

基于SpringBoot的“会员制医疗预约服务管理信息系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“会员制医疗预约服务管理信息系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 医院信息界面图…

从0开始linux(21)——文件(2)文件重定向

欢迎来到博主的专栏:从0开始linux 博主ID:代码小豪 文章目录 设备文件文件缓冲区重新认识文件描述符重定向 设备文件 在前一篇文章博主提到,当一个c/c进程运行时,会默认打开三个文件流,分别是stdin,stdout…