7.1 多态案例
一、案例1:计算器类
1.1 普通方式实现
#include <iostream>
#include <string>
using namespace std;class Calculator
{
public:int num1;int num2;int result(string oper){if (oper == "+")return num1 + num2;else if (oper == "-")return num1 - num2;else if (oper == "*")return num1 * num2;}
};void test1()
{Calculator c;c.num1 = 10;c.num2 = 10;//加法cout << c.num1 << "+" << c.num2 << "=" << c.result("+") << endl;//减法cout << c.num1 << "-" << c.num2 << "=" << c.result("-") << endl;//乘法cout << c.num1 << "*" << c.num2 << "=" << c.result("*") << endl;
}
1.2 多态实现
1.多态实现相对与普通方法代码量更大;
2.但若要增加程序功能(如除法)或出现异常时,普通实现方法需要对result()进行修改;
3.而多态实现方法则将加减分成不同的类,增加新功能不会影响到加减函数,并且某一功能 出现异常时可快速定位,增强代码维护性;
//多态实现
class Abstract_Calculator
{
public:int num1;int num2;virtual int result(){return 0;}
};class Add_Calculator : public Abstract_Calculator
{
public:int result(){return num1 + num2;}
};class Sub_Calculator : public Abstract_Calculator
{
public:int result(){return num1 - num2;}
};void test2()
{cout << "***************多态实现*****************" << endl;Abstract_Calculator* abc = new Add_Calculator;abc->num1 = 10;abc->num2 = 10;cout << abc->num1 << "+" << abc->num2 << "=" << abc->result() << endl;delete abc;abc = new Sub_Calculator;abc->num1 = 10;abc->num2 = 10;cout << abc->num1 << "-" << abc->num2 << "=" << abc->result() << endl;delete abc;
}
二、案例2:制作饮品
#include <iostream>
#include <string>
using namespace std;class Abstract_Drinking
{
public://1.煮水virtual void zhushui() = 0;//2.冲泡virtual void chongpao() = 0;//3.倒入杯中virtual void daoru() = 0;//4.加...virtual void dao() = 0;//5.总体制作流程void made_progress(){zhushui();chongpao();daoru();dao();}
};class Coffee : public Abstract_Drinking
{
public:void zhushui(){cout << "煮水" << endl;}void chongpao(){cout << "冲泡咖啡" << endl;}void daoru(){cout << "倒入杯中" << endl;}void dao(){cout << "加糖和牛奶" << endl;}
};class Tea : public Abstract_Drinking
{
public:void zhushui(){cout << "煮水" << endl;}void chongpao(){cout << "冲泡茶叶" << endl;}void daoru(){cout << "倒入杯中" << endl;}void dao(){cout << "加柠檬" << endl;}
};void doWork(Abstract_Drinking* abc)
{abc->made_progress();delete abc;
}void test1()
{doWork(new Coffee);cout << "---------------------" << endl;doWork(new Tea);
}int main()
{test1();return 0;
}

三、案例3:电脑组装
#include <iostream>
#include <string>
using namespace std;//CPU抽象类
class CPU
{
public:virtual void calculate() = 0;
};
//显卡抽象类
class VideoCard
{
public:virtual void display() = 0;
};
//内存条抽象类
class Memory
{
public:virtual void storage() = 0;
};
//电脑类
class Computer
{
public:Computer(CPU* cpu, VideoCard* vc, Memory* mem){_cpu = cpu;_vc = vc;_mem = mem;}void DoWork(){_cpu->calculate();_vc->display();_mem->storage();}~Computer(){if (_cpu != NULL){delete _cpu;_cpu = NULL;}if (_vc != NULL){delete _vc;_vc = NULL;}if (_mem != NULL){delete _mem;_mem = NULL;}}
private:CPU* _cpu;VideoCard* _vc;Memory* _mem;
};
//Intel厂商
class IntelCPU: public CPU
{
public:void calculate(){cout << "IntelCPU开始计算了" << endl;}
};
class IntelVideoCard : public VideoCard
{
public:void display(){cout << "IntelVideoCard开始显示了" << endl;}
};
class IntelMemory : public Memory
{
public:void storage(){cout << "IntelMemory开始存储了" << endl;}
};
//Lenovo厂商
class LenovoCPU : public CPU
{
public:void calculate(){cout << "LenovoCPU开始计算了" << endl;}
};
class LenovoVideoCard : public VideoCard
{
public:void display(){cout << "LenovoVideoCard开始显示了" << endl;}
};
class LenovoMemory : public Memory
{
public:void storage(){cout << "LenovoMemory开始存储了" << endl;}
};
//测试
void test1()
{cout << "创建第一台电脑--------------------" << endl;CPU* intel_CPU = new IntelCPU;VideoCard* intel_VideoCard = new IntelVideoCard;Memory* intel_Memory = new IntelMemory;Computer* computer1 = new Computer(intel_CPU, intel_VideoCard, intel_Memory);computer1->DoWork();delete computer1;cout << "创建第二台电脑--------------------" << endl;Computer* computer2 = new Computer(new LenovoCPU, new LenovoVideoCard, new LenovoMemory);computer2->DoWork();delete computer2;
}
int main()
{test1();return 0;
}
相关文章:
7.1 多态案例
一、案例1:计算器类 1.1 普通方式实现 #include <iostream> #include <string> using namespace std;class Calculator { public:int num1;int num2;int result(string oper){if (oper "")return num1 num2;else if (oper "-"…...
革新测试管理:集远程、协同、自动化于一身的统一测试管理平台
一、研发背景 当下汽车电子测试领域随着不断发展,自动化、智能化的软硬件一体测试解决方案已经成为趋势。能够整合各种测试资源、自动化测试流程,并提供数据分析和可视化报告,从而提高测试效率、降低成本,并确保汽车电子系统的可…...
HAProxy的详解
一、介绍 1.1 定义 HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前…...
网络安全实训第一天(dami靶场搭建,XSS、CSRF、模板、任意文件删除添加、框架、密码爆破漏洞)
1.环境准备:搭建漏洞测试的基础环境 安装完phpstudy之后,开启MySQL和Nginx,将dami文件夹复制到网站的根目录下,最后访问安装phptudy机器的IP地址 第一次登录删除dami根目录下install.lck文件 如果检测环境不正确可以下载php5.3.2…...
4.1 SQL的起源与发展
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...
android中实现禁掉有线网络
1.首先初始化mINetworkManagementServiceProxy // INetworkManagementService mNwService; Object mINetworkManagementServiceProxy;public void init() {// IBinder b ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);// mNwService INetworkManagementSe…...
docker-compose安装MongoDB 7.0.12
文章目录 一. Mac1.1 创建目录1.2 docker-compose.yaml默认不开启relSet开启relSet(数据同步) 1.3 部署1.4 卸载1.5 replSet配置1.5.1 初始化replSet1.5.2 创建超管用户1.5.3 验证用户1.5.4 查看replSet状态 二. Centos72.1 创建目录2.2 docker-compose.…...
Ubuntu下NFS和SSH服务
本篇文章记录Ubuntu下如何对NFS和SSH服务进行配置和开启。 目录 一、NFS服务 二、SSH服务 1、安装SSH服务 2. 启动和检查SSH服务 3. 配置SSH服务 4. 连接到SSH服务 5. 设置防火墙 6. 测试连接 三、结语 一、NFS服务 NFS(Network File System࿰…...
游戏管理系统
目录 Java程序设计课程设计 游戏管理系统 1系统简介 1.1需求分析 1.2 编程环境与工具 2系统总体设计 2.1 系统的功能模块图。 2.2 各功能模块简介。 3主要业务流程 (1)用户及管理员登录流程图 (2)信息添加流程 &#x…...
坐牢第二十七天(聊天室)
基于UDP的网络聊天室 一.项目需求: 1.如果有用户登录,其他用户可以收到这个人的登录信息 2.如果有人发送信息,其他用户可以收到这个人的群聊信息 3.如果有人下线,其他用户可以收到这个人的下线信息 4.服务器可以发送系统信息…...
C++自学笔记33(数据类型总结与变量)
数据类型 类型位范围char1 个字节-128 到 127 或者 0 到 255unsigned char1 个字节0 到 255signed char1 个字节-128 到 127int4 个字节-2147483648 到 2147483647unsigned int4 个字节0 到 4294967295signed int4 个字节-2147483648 到 2147483647short int2 个字节-32768 到…...
游戏引擎phaser.js3的使用之玩家和静态物理组碰撞
玩家和静态物理组都加载好了,那就应该开始操作玩家动态和静态之间的碰撞了 下面是通过点击图片按钮来操作碰撞的 sky.on(pointerdown, function () { console.log(图片被点击了!); }) 图片点击后让动态的玩家和静态的物理组碰撞,就可以这…...
springboot整合mybatis以及mybatis-plus 开发
一、springboot整合mybatis 1.注解版 1.1 导入坐标 <dependencies><!--mybatis坐标--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</…...
大语言模型微调框架Unsloth:简化模型微调流程,提升模型性能
Unsloth 将 Llama-3、Mistral、Phi-3 和 Gemma 等大型语言模型的微调速度提高了 2 倍,内存使用量减少了 70%,而且准确性不会降低! 特点 通过手动派生所有计算繁重的数学步骤和手写 GPU 内核,unsloth 可以在不更改任何硬件的情况…...
IPD-华为研发之道分析与理解
关于西方众多优秀的管理模式、理论我们学习过,也借鉴以及实践过,拿到《IPD-华为研发之道》通读研习后,正如书中所述,IPD是一套产品开发的模式、理念与方法,IPD思想,流程和方法是诸多成功企业优秀实践的经验…...
时空序列顶会文章
ICLR 2024 时间序列(Time Series)高分论文 - 知乎 (zhihu.com) ICML2024全部论文 icml.cc/virtual/2024/papers.html...
C语言-使用指针数组作为函数参数,实现对10个字符串进行排序
使用指针数组作为函数参数,实现对10个字符串进行排序 1.输入 lisi hahaha hehehe helloa leihoua lisi nihaoa wangwu ajax bureau2.输出 ajax bureau hahaha hehehe helloa leihoua lisi lisi nihaoa wangwu3.程序: #define _CRT_SECURE_NO_WARNING…...
???ABC366:F - Maximum Composition(dp,无序:贪心排序)
问题陈述 给你 NN 个线性函数 f1,f2,…,fNf1,f2,…,fN ,其中 fi(x)AixBifi(x)AixBi . 求由 KK 组成的序列 p(p1,p2,…,pK)p(p1,p2,…,pK) 中 fp1(fp2(…fpK(1)…))fp1(fp2(…fpK(1)…)) 的最大可能值。介于 11 和 NN (含)之间的个不…...
unity项目打包为webgl后应用于vue项目中(iframe模式)的数据交互
参考文章: 1.Unity打包WebGL: 导入Vue 2.unity文档-WebGL:与浏览器脚本交互 3.unity与vue交互(无第三方插件) 目录 一、前期工作1.新建.jslib文件2.新建.cs脚本3. 新建一个Text对象和button按钮对象4.添加脚本空对象UIEvent5.导出unity为w…...
【数据结构与算法 | 图篇】Bellman-Ford算法(单源最短路径算法)
1. 前言 前文的迪杰斯特拉算法不能求解有负边的图的最短路径的问题。而此文的Bellman-Ford可以处理含负权边的图算法,并且能检测出图中是否存在负环(权重和为负数的环). 2. 基本思想 1. 初始化: 对于所有顶点 v ∈ V \ {s}&am…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
