当前位置: 首页 > news >正文

C++中的多态,以及多态的实现、以及实现多态的两个特例。

一、 多态是什么?

        通俗点说,就是多种形态。具体点就是不同对象完成某种事情,会产生不一样的状态。

        举个例子:就好比:买票的时候,普通人、学生、军人等等,他们买票有不同的结果,普通人全价票,学生享受学生价的票,军人有优先购票以及军人的票价。

二、 多态的实现

        1、构成多态有两个条件:

                (1)必须是基类的指针或者基类的引用调用虚函数。

                (2)被调用的函数必须是虚函数,并且派生类必须对基类的虚函数进行重写。(有两个特殊)

简单点说就是:1. 虚函数重写        2. 父类指针或者引用去调用虚函数

        2、什么是虚函数?

                虚函数就是在成员函数前面加 virtual 修饰

         3、虚函数重写/覆盖条件:

                (1)虚函数 + 三同(函数名,参数,返回值)

                (2)不符合重写,就是隐藏关系

注意:(两个特殊)

        (1)子类虚函数不加 virtual 依旧构成重写(最好加上)

        (2)重写的协变。返回值可以不同,要求必须是父子关系的指针或者引用

下面用代码看一下,如下:

class Person {
public:virtual void BuyTicket() { cout << "买票全价" << endl; }
};class Student : public Person
{
public:virtual void BuyTicket() { cout << "买票半价" << endl; }
};class Soldier : public Person
{
public:virtual void BuyTicket() { cout << "买票优先" << endl; }
};//void Func(Person p) // 不是父类的指针或者引用就不是多态
void Func(Person& p)
{p.BuyTicket();
}int main()
{Person p;Student st;Soldier so;Func(p);Func(st);Func(so);return 0;
}

运行之后,结果如下:

 

上面运行结果可以看出来,不同的对象传给父类的引用,所调的函数是不一样的。

4 . 下面我打破多态的两个条件看一下。如下:

        (1)打破父类的指针或者引用

                我将引用改为普通对象调用,看一下结果如何,如下:

void Func(Person p) // 不是父类的指针或者引用就不是多态
//void Func(Person& p)
{p.BuyTicket();
}

运行结果如下:

修改之后,结果都掉的是 Person 的成员函数,为什么?因为修改之后就是普通调用了(具体细节我在下一篇文章细讲)

        (2)打破重写的条件(重写:虚函数 + 三同)

                ① 我将父类中的虚函数去掉,如下:

class Person {
public://virtual void BuyTicket() { cout << "买票全价" << endl; }void BuyTicket() { cout << "买票全价" << endl; }
};

运行结果如下:

也是如此,结果都是调用父类的方法。

                 ② 去掉三同中的函数名相同,这里我将三个函数名都改为不一样,如下:(如果改一个,那么其他两个还是相同,结果是各自的成员函数打印出来的结果)

class Person {
public:virtual void BuyTicket() { cout << "买票全价" << endl; }//void BuyTicket() { cout << "买票全价" << endl; }
};class Student : public Person
{
public:virtual void Buy() { cout << "买票半价" << endl; }
};class Soldier : public Person
{
public:virtual void BuyTi() { cout << "买票优先" << endl; }
};

运行结果如下:

5. 下面解释一下两个特例

        (1)子类虚函数不加 virtual 依旧构成重写(最好加上)

        (2)重写的协变。返回值可以不同,要求必须是父子关系的指针或者引用

先解释(1),如下:

我将 student、soldier 的成员函数的 virtual 去掉了,那么这两个成员函数就不是虚函数了吧?

那么结果怎么样?如下:

class Person {
public:virtual void BuyTicket() { cout << "买票全价" << endl; }//void BuyTicket() { cout << "买票全价" << endl; }
};class Student : public Person
{
public://virtual void BuyTicket() { cout << "买票半价" << endl; }void BuyTicket() { cout << "买票半价" << endl; }
};class Soldier : public Person
{
public://virtual void BuyTicket() { cout << "买票优先" << endl; }void BuyTicket() { cout << "买票优先" << endl; }
};

运行结果如下:

运行结果还是各自的方法,为什么?

        因为子类继承父类之后,将父类的虚函数继承下来了,重写了父类的方法,简单点说就是,子类继承之后,子类中也有一样的虚函数,但是虚函数的实现依然是子类的。

最后解释(2),如下:

 虽然返回值可以同,但是必须是父子关系的指针或者引用,我这里就用引用解释一下,如下:

class Person {
public:virtual Person& BuyTicket(){cout << "买票全价" << endl;return *this;}
};class Student : public Person
{
public:virtual Student& BuyTicket(){ cout << "买票半价" << endl; return *this;}
};class Soldier : public Person
{
public:virtual Soldier& BuyTicket() { cout << "买票优先" << endl; return *this;  }
};

运行结果如下: 

相关文章:

C++中的多态,以及多态的实现、以及实现多态的两个特例。

一、 多态是什么&#xff1f; 通俗点说&#xff0c;就是多种形态。具体点就是不同对象完成某种事情&#xff0c;会产生不一样的状态。 举个例子&#xff1a;就好比&#xff1a;买票的时候&#xff0c;普通人、学生、军人等等&#xff0c;他们买票有不同的结果&#xff0c;普通人…...

ESP32-C2系列开发板简介

C2是一个芯片采用4毫米x 4毫米封装&#xff0c;与272 kB内存。它运行框架&#xff0c;例如ESP-Jumpstart和ESP造雨者&#xff0c;同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统&#xff0c;受到了全球用户的信赖。它由支持Espressif以及所有…...

AI在狂飙,ChatGPT-4可直接在iPhone上使用啦

今天凌晨&#xff0c;OpenAI 正式在 App Store 推出了 ChatGPT 的 iOS app&#xff0c;瞬间冲上苹果商店免费榜第二名&#xff0c;效率榜第一名。 于是兴致勃勃的去下载体验了一番。整体不错&#xff0c;以后手机使用官方的 ChatGPT 更方便啦&#xff01;而且使用 GPT4 不再麻…...

【计算机操作系统学习资源汇总】

引言 做优秀资源的搬运工&#xff01;阅读经典&#xff0c;传承经典&#xff01; 每个人的水平和理解不同&#xff0c;因此总结的水平也不同&#xff0c;推荐阅读一手资源&#xff0c;有时间尽量啃书。 发现好的资源会持续更新… 看书的一点小建议 1. 《深入理解计算机系统》…...

吴恩达 x OpenAI Prompt Engineering教程中文笔记

Datawhale干货 作者&#xff1a;刘俊君&#xff0c;Datawhale成员 完整课程&#xff1a;《吴恩达ChatGPT最新课程》 &#x1f433;Reasons & Importance Important for research, discoveries, and advancement 对研究、发现和进步很重要 Accelerate the scientific resea…...

Everypixel: AI图片搜索引擎

【产品介绍】 Everypixel是一个基于人工智能的图片搜索引擎。可以搜索超过 50 个图片来源的优质的授权图库版权素材图片&#xff0c;还可以使用免费图案功能&#xff0c;找到适合自己需求的可定制无缝图案。 Everypixel利用深度学习和计算机视觉技术&#xff0c;为客户提供先进…...

IOS新建应用

一&#xff1a;Application App。普通app。Document App。打开是记事本类似App。Game。新建游戏相关app。RealityKit为新建一个打开摄像机&#xff0c;一个Ar立方体的应用。 SenceKit为有一架飞机旋转的游戏App。 SpirteKit为一个手指头按上会出一个手指特效的应用。 Metal为一…...

CMake学习笔记:搜索第三方库及头文件路径 find_package()命令

1、find_package命令基本介绍 在实际开发过程中&#xff0c;经常不可避免的会使用到第三方开源库&#xff0c;这些开源库可能是通过apt-get install 命令自动安装到系统目录&#xff0c;也可能是由我们自己下载库的源码然后通过编译安装到指定目录的。 不管哪种方式安装的库文…...

Vue3-黑马(一)

目录&#xff1a; &#xff08;1&#xff09;vue3-基础-环境准备 &#xff08;2&#xff09;vue3-基础-入门案例 &#xff08;3&#xff09;vue3-基础-main.ts &#xff08;1&#xff09;vue3-基础-环境准备 vue3的技术选型&#xff0c;它提供了两套API&#xff0c;一个是选…...

[组合数学]母函数与递推关系

文章目录 母函数---解决计数组合 球相同 盒子不同 不能是空 C n − 1 m − 1 \quad C_{n-1}^{m-1} Cn−1m−1​数的拆分 递推关系常系数线性齐次递推关系常系数线性非齐次递推关系汉诺塔递推关系 母函数—解决计数 普母函数—组合问题 指母函数—排列问题 f(x) ∑ i 1 n a i…...

opencv膨胀腐蚀

OpenCV 是一个开源的计算机视觉库&#xff0c;它包含了许多图像处理的功能&#xff0c;其中膨胀和腐蚀是两种常用的形态学操作。 膨胀&#xff08;Dilation&#xff09;&#xff1a;膨胀操作是将图像中的高亮区域&#xff08;白色像素&#xff09;扩张&#xff0c;从而填充低亮…...

ARM的读写内存指令与栈的应用

1.基础读写指令 写内存指令&#xff1a;STR MOV R1, #0xFF000000 MOV R2, #0x40000000 STR R1, [R2] 将R1寄存器中的数据写入到R2指向的内存空间 需注意&#xff0c;此命令是将R1中的数据写给R2所指向的内存空间&#xff0c;而不是直接把R1的数据赋给R2&#xff0c;R2寄存器…...

2022年平均工资出炉,IT行业又是第一

根据5月9日国家统计局最新资料显示&#xff0c;2022年&#xff0c;全国城镇非私营单位就业人员年平均工资为114029元&#xff0c;比上年增长6.7%&#xff0c;扣除通胀后实际增长4.6%。其中&#xff0c;行业间的差距相当明显。根据资料显示&#xff0c;2022年无论是在私营单位还…...

ov2640子设备核心操作详细分析

ov2640子设备核心操作详细分析 文章目录 ov2640子设备核心操作详细分析ov2640_subdev_core_ops核心操作获取寄存器值ov2640_g_register设置寄存器值ov2640_s_registeri2c_smbus_xferi2c_imx_xferi2c_smbus_xfer_emulatedi2c_transfer__i2c_transfer 设置ov2640的电源ov2640_s_p…...

MATLAB语句实现方阵性质的验证

系列文章目录 MATLAB绘图函数的相关介绍——海底测量、二维与三维图形绘制 MATLAB求函数极限的简单介绍 matlab系统环境思维导图 文章目录 系列文章目录 1. MATLAB语句验证方阵的六个性质如下 2. 六个性质的解释如下 3. 使用随机矩阵进行验证的代码示例如下 总结 前言 …...

使用Springboot AOP进行请求接口异常监控

常用注解 Aspect 切面类 Before 前置 AfterReturning 后置 Around 环绕 AfterThrowing 异常 切入点设置 execution(public * *(..)) 定义任意公共方法的执行 execution(* set*(..)) 定义任何一个以"set"开始的方法的执行 execution(* com.sys.service.UserService…...

【云原生|Kubernetes】05-Pod的存储卷(Volume)

【云原生Kubernetes】05-Pod的存储卷&#xff08;Volume) 文章目录 【云原生Kubernetes】05-Pod的存储卷&#xff08;Volume)简介Volume类型解析emptyDirHostPathgcePersistentDiskNFSiscsiglusterfsceph其他volume 简介 Volume 是Pod 中能够被多个容器访问的共享目录。 Kubern…...

Python实现数据结构

文章目录 一、Python实现数据结构1.1 python实现单向链表1.2 python实现单向循环链表1.3 python实现双向链表 一、Python实现数据结构 1.1 python实现单向链表 singleLinkedList.py class SingleNode:"""the node of single link list"""def …...

esp32CAM环境安装教程---串口驱动安装

前言 &#xff08;1&#xff09;本人安装好arduino 的ESP32环境之后&#xff0c; 发现一直下载不进去程序。一直说Cannot configure port, something went wrong. Original message: PermissionError。 &#xff08;2&#xff09;查阅了很多资料&#xff0c;用了各种办法&#…...

Java中List和Array转换

文章目录 List -> Array1. 调用toArray()方法直接返回一个Object[]数组&#xff1a;2. 给toArray(T[])传入一个类型相同的Array&#xff0c;List内部自动把元素复制到传入的Array中&#xff1a;3. 通过List接口定义的T[] toArray(IntFunction<T[]> generator)方法&…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...