C++中的多态(概念篇)

news2025/1/16 7:58:40

多态的概念

通俗来说,就是多种形态,具体点就是去完成某一个行为,不同的对象去完成时会产生出不同的状态。比如最常见的买票,学生为半价,成人为全票。

多态的分类

静态的多态:如函数重载,看起来时调用同一个函数但是有不同的行为。(编译时实现)
动态的多态:一个父类对象的引用 或者指针去调用同一个而函数,传递不同的对象,会调用不同的函数。(运行时实现)

多态的定义及实现

函数的重写

函数的重写需要子类和父类都要有这个函数且这个函数为虚函数,同时虚函数要满足三同(函数名、返回值、参数)
参数只看类型是否相同,并不看缺省值

多态构成的条件(这里谈论的是动态的多态)

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。在继承中构成多态还有两个条件:
1. 必须通过父类指针或者引用调用虚函数
2. 被调用的函数必须是虚函数,且子类必须对父类的虚函数进行重写

多态的演示

#include<iostream>
using namespace std;

class Person
{
public:
	virtual void BuyTicket()
	{
		cout << "全票" << endl;
	}
};
class Student:public Person
{
public:
	virtual void BuyTicket()
	{
		cout << "半票" << endl;
	}
};

void Func(Person& people)
{
	people.BuyTicket();
}
int main()
{
	Person pe;
	Func(pe);

	Student st;
	Func(st);
	return 0;
}

在这里插入图片描述
这里构成多态,不同的对象去调用同一个函数,完成了不同的状态。
在这里插入图片描述
在这里插入图片描述
若不是引用或者指针就不能实现多态,如直接传对象。
若构成多态:传的是那个类型的对象,调用的就是这个类型的虚函数,跟对象有关。
若不构成多态:固定调用哪个people类型的函数,跟类型有关。

虚函数

被virtual修饰的类成员函数为虚函数。

虚函数的重写

子类中有一个跟父类完全相同的函数(返回值,函数名,参数列表完全相同)称为子类的虚函数重写了父类的虚函数
**注意:**在重写父类虚函数时,子类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后父类的虚函数被继承下来了在子类中依然保持着虚函数的属性)但是这种写法不规范,不建议这样子使用。

虚函数重写的两个例外

协变

子类重写父类虚函数时,与父类虚函数返回值类型不同。即父类虚函数返回父类对象的指针或者引用,子类虚函数返回子类对象的指针或者引用时,称为协变。

class A {};
class B : public A {};
class Person {
public:
	virtual A* f() { return new A; }//父类成员函数返回值为另一个父类
};
class Student : public Person {
public:
	virtual B* f() { return new B; }//子类成员函数返回值为另一个子类
};

析构函数的重写

如果父类的析构函数为虚函数,此时子类的析构函数只需要定义,不管加不加virtual关键字,都与父类的析构函数构成重写,虽然父类和子类的析构函数名称不相同。编译器会将析构函数函数名统一处理称destructor()。
动态申请的父子对象,如果给了父类指针管理,那么需要析构函数是虚函数。

C++11override和final

final

final的作用为修饰虚函数,表示该虚函数不能够被重写。
在这里插入图片描述

override

检查子类虚函数是否重写了父类某个虚函数,如果没有重写将编译报错。
在这里插入图片描述

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

在这里插入图片描述

抽象类

在虚函数的后面写上 = 0,则这个函数为纯虚函数。
包含纯虚函数的类叫做抽象类(也叫接口类)抽象类不能实例化出对象,子类继承后也不能实例化出对象,只有重写纯虚函数,子类才可以实例化出来对象,纯虚函数规范了子类必须重写,另外,纯虚函数更体现出了接口继承。

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

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

相关文章

【Linux入门指北】 网站服务

网站服务 文章目录网站服务一、简介二、静态站点三、动态站点1.LAMP2.部署论坛系统discuz3.部署博客系统 wordpress4.部署网上商城 ecshop5.部署网校系统edusoho一、简介 1.前言 UI的转变&#xff1a;B/S架构 2.名词 HTML&#xff08; HyperText Markup Language&#xff09;…

Arduino 简易屏显电子温度计

Arduino 简易屏显电子温度计一、前言二、硬件要求三、参数基础四、原理剖析五、实验思路六、程序概要七、arduino使用接线八、成果展示九、总结一、前言 温度计的使用&#xff0c;在日常生活中随处可见&#xff0c;电子行业也有相应的温控传感器设备&#xff0c;不管的是电子芯…

单片机实训day6——Proteus8.6版本+ STM32F103驱动LCD12864显示Keil5程序设计

内 容&#xff1a;实现LCD显示 学 时&#xff1a;4学时 知识点&#xff1a;LCD12864芯片介绍&#xff0c;读写操作时序&#xff0c;电路设计 重点&#xff1a; 读写操作时序 难点&#xff1a;读写操作时序 时间&#xff1a;2022年12月26日 9:00&#xff5e;11:50 总结&…

抖音小程序实践一:申请初始化

一、官方文档与实践 抖音小程序是什么&#xff1f;从官方视频了解 从2022年开始&#xff0c;字节跳动就开始火力全开的与知名企业合作&#xff0c;推动抖音小程序的孵化&#xff0c;然后逐步开放普通企业争相进入抖音小程序领域&#xff0c;来分一分流量的红利。 巨量星图抖…

微信小程序----使用发布订阅模式

目录 前言 小程序使用PubSubJS 获取 PubSubJS npm 构建 使用pubsub-js 1、使用publish发布消息 2、使用subscribe函数订阅消息 前言 发布-订阅模式 又叫 观察者模式。 它定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于…

excel图表设计:如何让数据变化更加可视化

挖掘数据背后的意义&#xff0c;不能只是单纯的将原始数据&#xff0c;从数字变成图表&#xff1b;而是要让数据变化具现出来&#xff0c;能直观看到其变化形态。 在我们的实际工作中&#xff0c;通常会看到很多类似下面这种架构的数据。 【正文】 因为这样的数据是非常常见的…

HTTP协议及Servlet详解

目录 HTTP协议 1、HTTP协议简介 2、HTTP协议特点 3、HTTP协议通信流程&#xff08;工作原理&#xff09; 4、HTTP报文格式 4.1、HTTP请求报文 4.2、HTTP响应报文 4.3、HTTP状态消息 Servlet详解 1、Servlet核心接口和类 1.1、Servlet接口 1.2、GenericServlet抽象类 …

分层自动化测试模型深入研究

分层自动化测试模型的发展 分层自动化测试模型最早是由Mike Cohn在2009年出版的《Succeeding with Agile》书中的第十六章进行阐述的,他说“测试金字塔是分层测试的一种最佳实践“。金字塔自动化测试模型如上图A所示,从下往上分为单元测试、接口测试、界面测试(其实我更习惯…

C语言 指针进阶学完指针必看练习题详解

该篇与上篇衔接 二维数组 int main() {int a[3][4] { 0 };printf("%d\n", sizeof(a));//48 3*4*sizeof(int)printf("%d\n", sizeof(a[0][0]));//4 第一行第一个元素 就是整形大小printf("%d\n", sizeof(a[0]));//16//a[0]就可以理解为 第…

Windows卸载easyconnect

Windows卸载easyconnect卸载深信服VPN客户端easyconnect解决办法卸载SangforPWEx服务手动卸载安装目录卸载深信服VPN客户端easyconnect Windows下的深信服VPN客户端easyconnect无法卸载. 解决办法 下载地址: http://download.sangfor.com.cn/download/product/sslvpn/Sangfor…

浅谈图数据库1:什么是图?

目录 一、图是什么&#xff1f; 二、“图”源自哪里&#xff1f; 三、加权图是什么&#xff1f; 四、有向图是什么&#xff1f; 五、图能给我们带来什么&#xff1f; 一、图是什么&#xff1f; 说到“图” 大部分人首先想到的是这样滴——图像 ​或者是 饼状图 折线图…

【ML实验4】多分类贝叶斯模型

实验代码获取 github repo 山东大学机器学习课程资源索引 实验目的 实验内容 数据集 构建多分类贝叶斯模型 这里的条件独立性指的是特征xjx_jxj​之间相互独立&#xff0c;这是一个十分强的假设。 证明 Problem Set 2 思路主要是证明下面引理&#xff0c;用拉格朗日乘子法&a…

CP2102国产替代DPU02— USB 转 UART 桥接芯片

DPU02是一个高度集成的USB转UART的桥接控制器&#xff0c;该产品提供了一个简单的解决方案&#xff0c;可将RS-232设计更新为USB设计&#xff0c;并简化PCB组件空间。该DPU02包括了一个USB 2.0全速功能控制器、USB收发器、振荡器、EEPROM和带有完整调制解调控制信号的异步串行数…

【聆思CSK6视觉AI开发套件试用】Win11下安装全过程处理兼容性问题以及实现亮灯AI头肩检测

本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;Wordiansom Win11上并且安装在其他盘的时候会出现的问题坑。。。。。。&#xff08;能用win10就用win10&#xff09;。 1. 晚拿到的开发板套件…

冲量在线携手中国电信研究院、北京电信和海光信息打造的数信链网的入选2022“星河”隐私计算标杆案例

为促进大数据技术产品及相关产业发展&#xff0c;加快培育数据要素市场、充分发挥数据作为生产要素的独特价值&#xff0c;树立行业标杆榜样力量&#xff0c;中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)连续六年共同组织大数据“星河&#xf…

Java8 Stream流

目录Java8 Stream流一、Stream概述二、Stream 的创建&#xff08;4种方式&#xff09;参考地址&#xff08;表示感谢&#xff09;&#xff1a;Java8 Stream流 一、Stream概述 Stream API说明 Java8中有两大最为重要的改变。第一个是 Lambda 表达式&#xff1b;另外一个则是 St…

Gradle Plugin的开发及发布

Gradle Plugin的开发及发布前言插件的开发学习阶段&#xff08;build.gradle脚本&#xff09;开发阶段&#xff08;buildSrc&#xff09;PluginTaskExtension发布阶段&#xff08;独立module&#xff09;发布到本地发布到MavenCentral准备sonatype账号创建pgp证书配置sonatype和…

数据结构与算法基础(王卓)(6):带尾指针(单向)循环链表的合并;双链表及其插入和删除的详细操作

带尾指针&#xff08;单向&#xff09;循环链表的合并 PPT(157)&#xff1a; 操作前初始设定预设的条件​​​​我们要做的&#xff0c;即&#xff1a; 让A表尾节点指向B表首结点&#xff0c;让B表尾节点指向A表首结点&#xff1a; Project 1&#xff1a; Status 合并链表(…

NVIDIA NCCL 源码学习(九)- 单机内ncclSend和ncclRecv的过程

上节介绍了通信链路的建立过程&#xff0c;本节介绍下单机内部ncclSend和ncclRecv的运行过程。 单机内的通信都是通过kernel来进行的&#xff0c;所以整个通信的过程可以分为两步&#xff0c;第一步是准备kernel相关的参数&#xff0c;第二步是实际执行kernel的过程。 为方便…

闯关(贪心)

某综艺频道推出了一个闯关活动。 活动一共包含 n 个关卡&#xff08;编号 1∼n&#xff09;&#xff0c;其中 m 个关卡为特殊关卡。 每个关卡都有一个通关分数&#xff0c;其中第 i 个关卡的通关分数为 ai。 挑战者可以自由决定所有关卡的具体挑战顺序&#xff0c;并且每通过…