当前位置: 首页 > 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)方法&…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

DeepSeek越强,Kimi越慌?

被DeepSeek吊打的Kimi&#xff0c;还有多少人在用&#xff1f; 去年&#xff0c;月之暗面创始人杨植麟别提有多风光了。90后清华学霸&#xff0c;国产大模型六小虎之一&#xff0c;手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水&#xff0c;单月光是投流就花费2个亿。 疯…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...

Java中栈的多种实现类详解

Java中栈的多种实现类详解&#xff1a;Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...