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

【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 公里
请按任意键继续. . .

在这里插入图片描述

相关文章:

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

文章目录 一、" 多态 " 实现条件1、" 多态 " 实现需要满足的三个条件2、" 多态 " 的应用场景3、" 多态 " 的思想 二、" 多态 " 代码示例 一、" 多态 " 实现条件 1、" 多态 " 实现需要满足的三个条件 &q…...

创建一个Keil项目

1、创建项目 2、选择存放的文件夹&#xff0c;还有设置项目名 3、选择型号&#xff08;因为没有STC,用下面这个替代&#xff0c;功能差不多&#xff09; 4、选择不用启动文件 5、就会得到下面这个&#xff0c;可以在Source Group 1下面编写代码了 6、右键source Group 1,添加c语…...

Xray的简单使用

xray 简介 xray 是一款功能强大的安全评估工具&#xff0c;由多名经验丰富的一线安全从业者呕心打造而成&#xff0c;主要特性有: 检测速度快。发包速度快; 漏洞检测算法效率高。支持范围广。大至 OWASP Top 10 通用漏洞检测&#xff0c;小至各种 CMS 框架 POC&#xff0c;均…...

Linux Ubunto Nginx安装

一 安装前 环境准备 gcc $ sudo apt-get install gcc zlib $ sudo apt-get install zlib1g-dev pcre $ sudo apt-get install libpcre3 libpcre3-dev openssl $ sudo apt-get install openssl libssl-dev‘ ubuntu 安装 libssl-dev失败的解决方案 1.安装aptitude sudo apt-g…...

深度学习中的epoch, batch 和 iteration

名词定义epoch使用训练集的全部数据进行一次完整的训练&#xff0c;称为“一代训练”batch使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新&#xff0c;这样的一部分样本称为&#xff1a;“一批数据”iteration使用一个batch的数据对模型进行一次参数更新的过…...

unity开发安卓视频文件适配手机和平板

using UnityEngine; using UnityEngine.UI;public class VideoResize : MonoBehaviour {private RawImage rawImage;private VideoPlayer videoPlayer;private void Start(){rawImage GetComponent<RawImage();videoPlayer GetComponent<VideoPlayer>();// 播放视频…...

NLP之RNN的原理讲解(python示例)

目录 代码示例代码解读知识点介绍 代码示例 import numpy as np import tensorflow as tf from tensorflow.keras.layers import SimpleRNNCell# 第t时刻要训练的数据 xt tf.Variable(np.random.randint(2, 3, size[1, 1]), dtypetf.float32) print(xt) # https://www.cnblog…...

yo!这里是进程间通信

目录 前言 进程间通信简介 目的 分类 匿名通道 介绍 举例&#xff08;进程池&#xff09; 命名管道 介绍 举例 共享内存 介绍 共享内存函数 1.shmget 2.shmat 3.shmdt 4.shmctl 举例 1.框架 2.通信逻辑 消息队列 信号量 同步与互斥 理解信号量 后记…...

使用docker安装MySQL,Redis,Nacos,Consul教程

文章目录 安装MySQL安装Redis安装Nacos安装Consul 如未安装docker&#xff0c;参考教程&#xff1a; https://blog.csdn.net/m0_63230155/article/details/134090090 安装MySQL #拉取镜像 sudo docker pull mysql:latestsudo docker run --name mysql \-p 3306:3306 \-e MYSQ…...

python和Springboot如何交互?

Python和Spring Boot可以通过RESTful API进行交互。Spring Boot通常用于后端开发&#xff0c;提供了快速构建RESTful API的工具&#xff0c;而Python则可以用于编写前端或与后端交互的代码。 要实现Python和Spring Boot的交互&#xff0c;可以按照以下步骤进行&#xff1a; 在…...

Qt实现json解析

前提要点 json文件&#xff0c;可通过键值的方式存储你所需要的数据&#xff0c;斌且支持多种类型存储&#xff0c;类似于一种结构化的数据库&#xff0c;在读取json文件时可通过相对应的关键字精准获取。他是一种树状结构&#xff0c;我们可以自己设定叶子的数量以及他所代表…...

Ajax、Json深入浅出,及原生Ajax及简化版Ajax

Ajax 1.路径介绍 1.1 JavaWeb中的路径 在JavaWeb中&#xff0c;路径分为相对路径和绝对路径两种&#xff1a; 相对路径&#xff1a; ./ 表示当前目录(可省略) ../ 表示当前文件所在目录的上一级目录 绝对路径&#xff1a; http://ip:port/工程名/资源路径 2.2 在JavaWeb中…...

前端第一阶段测试

前端第一阶段测试 选择问答 如果觉得有用请给我点个赞⑧~ 选择 1、【单选】下列哪个是子代选择器 A A、p>b B、p b C、pb D、p.b 2、【单选】下述有关css属性position的属性值的描述&#xff0c;说法错误的是&#xff1f;B A、static&#xff1a;没有定位&#xff0c;元素出…...

openlayers+vue的bug

使用addInteraction添加交互draw绘制&#xff0c;预期removeInteraction删除交互draw绘制时不再绘制&#xff0c;但是删除绘制不起作用&#xff0c;各种找原因&#xff0c;结果把data中的map变量注释掉即可&#xff0c;原因未知。 <template><div><div id"…...

实时数仓-Hologres介绍与架构

本文是向大家介绍Hologres是一款实时HSAP产品&#xff0c;隶属阿里自研大数据品牌MaxCompute&#xff0c;兼容 PostgreSQL 生态、支持MaxCompute数据直接查询&#xff0c;支持实时写入实时查询&#xff0c;实时离线联邦分析&#xff0c;低成本、高时效、快速构筑企业实时数据仓…...

asp.net教务管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net 教务管理信息系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net教务管理系统 应用技术&a…...

爬虫、数据清洗和分析

爬虫、数据清洗和分析是在数据科学、数据挖掘和网络爬虫开发领域中常见的概念。 爬虫&#xff08;Web Scraping&#xff09;&#xff1a;爬虫是一种自动化程序或脚本&#xff0c;用于从互联网上的网站上提取信息。这些信息可以是文本、图像、视频或其他类型的数据。爬虫通常会…...

SpringBoot | SpringBoot中实现“微信支付“

SpringBoot中实现"微信支付": 1.“微信支付”产品2."微信支付"接入流程3.“微信小程序支付”时序图&#xff1a;3.1 “商家端JSAPI下单” 接口3.2 “微信小程序端调起支付” 接口 4.微信支付准备工作&#xff1a;4.1 获得微信支付平台证书、商户私钥文件4…...

基于SSM和VUE的留守儿童信息管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

VMware 16开启虚拟机电脑就蓝屏W11解决方法

问题现象 解决方法 控制面板->程序->启用或关闭windows功能->勾选虚拟机平台->重启...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...