【C++】多态 ③ ( “ 多态 “ 实现需要满足的三个条件 | “ 多态 “ 的应用场景 | “ 多态 “ 的思想 | “ 多态 “ 代码示例 )

文章目录

  • 一、" 多态 " 实现条件
    • 1、" 多态 " 实现需要满足的三个条件
    • 2、" 多态 " 的应用场景
    • 3、" 多态 " 的思想
  • 二、" 多态 " 代码示例





一、" 多态 " 实现条件




1、" 多态 " 实现需要满足的三个条件


" 多态 " 实现需要满足以下三个条件 :

  • 首先 , 要有继承关系 ;
  • 然后 , 父类中的函数需要有 virtual 关键字修饰 , 子类重写该 " 虚函数 " ;
  • 最后 , 父类指针 或 父类引用 指向 子类的对象 ;

满足 ① 继承 , ② 虚函数重写 , ③ 父类指针/引用指向子类对象 三个条件 , 即可实现多态 ;


在 C 语言中 , 指针存在的 最大意义 就是 " 间接赋值 " ;

" 间接赋值 " 成立的三大条件 :

  • 首先 , 需要有两个变量 , 一个形参 , 一个实参 ;
    • 形参 是 函数 的 参数 , 指针 数据类型 ;
    • 实参 是 实际传入函数的 指针地址 ;
  • 然后 , 建立关系 , 将 实参 传递给 形参 ;
  • 最后 , 使用 传入的 指针 修改 实参的值 ;
    • 实际上修改的事 指针指向的地址 的内存数据 ;

2、" 多态 " 的应用场景


借助 " 多态 " , 我们可以事先 开发出 一套 软件框架 , 实现一些功能 ;

在 软件框架 中 的 函数 中 , 传入 父类指针 作为 参数 , 之后 通过该 父类指针 调用其 virtual 虚函数 ;

在之后的开发中 , 编写 子类 实现 父类 , 并 重写 父类的 virtual 虚函数 ;

然后 调用 软件框架 中的 函数 , 传入 新编写 的 子类对象指针 , 此时 调用的 不再是 父类的 函数 , 而是 子类重写的 函数 ;

这就实现了 复用 后面写的代码 ;


3、" 多态 " 的思想


" 封装 " 突破了 C 语言 的 函数概念 , C 语言中的 函数 仅能 封装 逻辑操作 , " 封装 " 能将 数据 和 操作 同时封装到一起 , 组成类 ;

将 封装好的 类对象 传入函数中 , 可以在函数中调用 类对象的 成员变量 和 成员方法 ;

  • 如果仅 传入 C 语言 的函数 , 仅能调用 函数 中的逻辑代码 ;
  • 如果仅 传入 数据 , 操作该数据的逻辑代码需要额外传入 ;

" 继承 " 可以实现 代码的 复用 , 这里的 复用 是 复用 之前写的代码 ;


" 多态 " 实现的也是 代码 的复用 , 这里的 复用 是 复用 之后写的代码 ;

" 多态 " 多用于 软件框架 , 提前实现 功能框架 , 功能细节 , 使用多态在后续开发时实现 ;





二、" 多态 " 代码示例



先开发出 导弹发射 的框架出来 , 此时还没有研究出导弹 , missileFire 函数用于发射导弹 ;

void missileFire(Missile* missile)
{// 发射导弹missile->fire();
}

后期 , 研究出了 DF1 导弹 , 为其设置发射方法 , 重写 发射 虚函数 , 此时向 missileFire 函数中传入 DF_1 类的对象地址 , 调用的事 DF_1 类对象的发射方法 ;

	DF_1 df1;missileFire(&df1);

研究出了 DF2 导弹 , 为其设置发射方法 , 重写 发射 虚函数 , 此时向 missileFire 函数中传入 DF_2 类的对象地址 , 调用的事 DF_2 类对象的发射方法 ;

	DF_2 df2;missileFire(&df2);

研究出了 DF3 导弹 , 为其设置发射方法 , 重写 发射 虚函数 , 此时向 missileFire 函数中传入 DF_3 类的对象地址 , 调用的事 DF_3 类对象的发射方法 ;

	DF_3 df3;missileFire(&df3);

注意 : 要 多态 的函数 , 必须使用 virtual 关键字 , 将其设置为虚函数 ;


代码示例 :

#include "iostream"
using namespace std;// 父类 - 导弹
class Missile {
public:virtual void fire(){cout << "发射导弹" << endl;}
public:int scope;
};class DF_1 : public Missile
{
public:virtual void fire(){cout << "发射东风1导弹, 射程 " << scope << " 公里" << endl;}
public:int scope = 600;
};class DF_2 : public Missile
{
public:virtual void fire(){cout << "发射东风2导弹, 射程 " << scope << " 公里" << endl;}
public:int scope = 1300;
};class DF_3 : public Missile
{
public:virtual void fire(){cout << "发射东风3导弹, 射程 " << scope << " 公里" << endl;}
public:int scope = 2800;
};void missileFire(Missile* missile)
{// 发射导弹missile->fire();
}int main() {DF_1 df1;missileFire(&df1);DF_2 df2;missileFire(&df2);DF_3 df3;missileFire(&df3);// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
}

执行结果 :

发射东风1导弹, 射程 600 公里
发射东风2导弹, 射程 1300 公里
发射东风3导弹, 射程 2800 公里
请按任意键继续. . .

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--笔记

0. 内容 1. 时间戳同步问题及意义 时间戳同步的原因&#xff1a;如果不同步&#xff0c;由于IMU频率高&#xff0c;可能由于时间戳不同步而导致在两帧camera之间的时间内用多了或者用少了IMU的数据&#xff0c;且时间不同步会导致我们首尾camera和IMU数据时间不同&#xff0c;…

java基础 特殊文件

1.Properties属性文件&#xff1a; 1.1使用Properties读取属性文件里的键值对数据&#xff1a; package specialFile;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Enumeration; import java.util.Propert…

读高性能MySQL(第4版)笔记21_读后总结与感想兼导读

1. 基本信息 高性能MySQL&#xff1a;经过大规模运维验证的策略&#xff08;第4版&#xff09; High Performance MySQL, Fourth Edition [美] Silvia Botros(西尔维亚博特罗斯)&#xff1b;Jeremy Tinley(杰里米廷利) 电子工业出版社,2022年10月出版 1.1. 读薄率 书籍总字…

【机器学习合集】优化目标与评估指标合集 ->(个人学习记录笔记)

文章目录 优化目标与评估指标1. 优化目标1.1 两类基础任务与常见优化目标1.2 分类任务损失0-1损失交叉熵损失与KL散度softmax损失的理解与改进Hinge损失 1.3 回归任务损失L1/L2距离L1/L2距离的改进 Huber loss 2. 评测指标2.1 分类任务中评测指标准确率(查准率)/召回率(查全率)…

修改svc的LoadBalancer的IP引发的惨案

文章目录 背景修改externalIPs的操作api-server报错日志挽救教训 背景 k8s集群没有接外部负载均衡&#xff0c;部署istio的时候ingressgateway一直pending。 于是手动修改了这个lb svc的externalIP&#xff0c;于是k8s就崩了&#xff0c;如何崩的&#xff0c;且听我还道来。 …

CRM客户管理系统源码 带移动端APP+H5+小程序

CRM客户管理系统源码 带移动端APPH5小程序 开发环境: thinkphp mysql 功能介绍&#xff1a; 1、 办公管理&#xff1a;审批管理、工作报告、日程管理、办公审批、公告管理 2、 客户管理&#xff1a;我的客户、客户列表、成交客户、行业类别、预查、地区列表、客户状态、客…

【Unity数据交互】JSON开山篇

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Rabbitmq----分布式场景下的应用

服务异步通信-分布式场景下的应用 如果单机模式忘记也可以看看这个快速回顾rabbitmq,在做学习 消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一…

嵌入式软件找实习需要掌握哪些知识?

嵌入式软件找实习需要掌握哪些知识&#xff1f; 嵌入式软件实习暂时不用刷力扣。具体需要掌握哪些知识每个公司的要求都不太一样&#xff0c;因为嵌入式也有很多细分领域&#xff0c;单片机、C语言是需要熟悉的&#xff0c;最近很多小伙伴找我&#xff0c;说想要一些嵌入式资料…

如何在VScode中让printf输出中文

如何在VScode中让printf输出中文&#xff1f; 1、在“Visual Studio Code”图标上右击&#xff0c;弹出对话框。见下图&#xff1a; 2、点击“以管理员身份运行”&#xff0c;得到下图&#xff1a; 3、点击“UTF-8”按钮&#xff0c;得到下图&#xff1a; 4、点击“通过编码重…

什么是时序图,看了你就明白

目录 前言: 什么是时序图: 时序图的组成元素&#xff1a; 1. 角色(Actor) 2. 对象(Object) 3. 生命线(LifeLine) 4. 激活期(Activation) 5. 消息类型(Message) 6.组合片段(Combined fragment) 时序图的绘制规则:​ 绘制时序图的3步&#xff1a; 1.划清边界&#xf…

Vue $nextTick

我们用一个例子来说明$nextTick的作用&#xff1a; 我们用一个变量showIpt来控制input框的显示和隐藏&#xff0c;默认是隐藏。 我们点击一个按钮后显示这个输入框的同时&#xff0c;input还要自动获取焦点。 但是我们点击按钮过后并没有生效。 为什么&#xff1f;this.show…

Linux云服务器限制ip进行ssh远程连接

对Linux云服务器限制IP进行SSH远程连接的原因主要有以下几点&#xff1a; 增加安全性&#xff1a;SSH是一种加密的网络传输协议&#xff0c;可以保护数据的机密性和完整性。通过限制SSH连接的IP地址&#xff0c;可以防止未经授权的访问和数据泄露。只有拥有访问权限的IP地址才…

关于亚马逊 CodeWhisperer 的使用体验

Amazon CodeWhisperer 是亚⻢逊出品的一款基于机器学习的 AI 编程助手&#xff0c;可实时提供代码建议。现在已正式可用&#xff0c;面向个人提供免费服务&#xff0c;通过在各种流行的IDE里集成 CodeWhisperer&#xff08;包括我们常用的 JetBrains 产品包及 Vscode 工具集&am…

什么是蓝桥杯?什么是蓝桥STEMA考试?

第十五届蓝桥大赛赛事安排? STEMA考试11月(考试时间11月26日) STEMA考试1月(2024年1月) STEMA考试3月(2024年3月) 第十五届蓝桥杯省赛(2024年4月待定) 第十五届蓝桥杯国赛(2024年5月待定) 注:以上时间具体以组委会官方发布为准。 01.蓝桥杯 蓝桥杯全国软件和…

【C++】C++入门(中)--引用

目录 一 引用概念 二 引用特性 三 常引用 四 引用使用场景 1 做参数 2. 做返回值 1 例一 2 例二 3 例三 4 例四 五 传值, 传引用效率比较 六 值和引用的作为返回值类型的性能比较 七 引用和指针的区别 一 引用概念 引用不是新定义一个变量&#xff0c;而是给已存…

2015年亚太杯APMCM数学建模大赛B题城市公共交通服务水平动态评价模型求解全过程文档及程序

2015年亚太杯APMCM数学建模大赛 B题 城市公共交通服务水平动态评价模型 原题再现 城市公共交通服务评价是城市公共交通系统建设和提高公共交通运营效率的重要组成部分。对于公交企业&#xff0c;管理和规划部门&#xff0c;传统公交车站、线路和换乘枢纽的规划数据只是基于主…

深入探究ASEMI肖特基二极管MBR60100PT的材质

编辑-Z 在电子零件领域中&#xff0c;肖特基二极管MBR60100PT因其出色的性能和广泛的应用而显得尤为关键。理解其材质不仅有助于我们深入理解其运作原理&#xff0c;也有助于我们做出更合适的电子设计。那么&#xff0c;肖特基二极管MBR60100PT是什么材质呢? 首先&#xff0c…

【Ansible自动化运维工具 1】Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)

Ansible常用模块 一、Ansible1.1 简介1.2 工作原理1.3 Ansible的特性1.3.1 特性一&#xff1a;Agentless&#xff0c;即无Agent的存在1.3.2 特性二&#xff1a;幂等性 1.4 Ansible的基本组件 二、Ansible环境安装部署2.1 安装ansible2.2 查看基本信息2.3 配置远程主机清单 三、…

子集生成算法:给定一个集合,枚举所有可能的子集

给定一个集合&#xff0c;枚举所有可能的子集。 &#xff08;为简单起见&#xff0c;本文讨论的集合中没有重复元素&#xff09; 1、方法一&#xff1a;增量构造法 第一种思路是一次选出一个元素放到集合中&#xff0c;程序如下&#xff1a; void print_subset(int n, int …