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

类和对象—多态—案例2—制作饮品

案例描述:

制作饮品的大致流程为:煮水-冲泡-倒入杯中-加入辅料
利用多态技术实现本案例,提供抽象制作产品基类,提供子类制作咖啡和茶叶

 思路解析:

 1. 定义抽象基类

- 创建 `AbstractDrinking` 抽象类,该类定义了制作饮品的通用接口。

- 包含四个纯虚函数:`Boil()`(煮水)、`Brew()`(冲泡)、`PourInCup()`(倒入杯中)和 `PutSomething()`(加入辅料),这些函数需要在派生类中具体实现。

- 提供一个 `makeDrink()` 成员函数,该函数按顺序调用上述四个纯虚函数,定义了制作饮品的通用流程。

2. 定义具体饮品类

- 定义 `Coffee` 类,继承自 `AbstractDrinking` 抽象类。

- 实现 `Boil()`、`Brew()`、`PourInCup()` 和 `PutSomething()` 四个纯虚函数,具体描述制作咖啡的步骤,如煮开水、冲泡咖啡、倒入杯中、加入糖和牛奶。

- 定义 `Tee` 类(可能拼写有误,应为 `Tea`),同样继承自 `AbstractDrinking` 抽象类。

- 实现 `Boil()`、`Brew()`、`PourInCup()` 和 `PutSomething()` 四个纯虚函数,具体描述制作茶的步骤,如煮开水、冲泡茶叶、倒入杯中、加入柠檬。

3. 定义工作函数

- 定义 `doWork()` 函数,该函数接受一个指向 `AbstractDrinking` 类的指针作为参数。

- 在函数内部调用 `makeDrink()` 函数制作饮品。

- 使用 `delete` 释放动态分配的内存,避免内存泄漏。

4. 定义测试函数

- 定义 `test01()` 函数,用于测试制作咖啡和茶的功能。

- 调用 `doWork()` 函数制作咖啡,并在制作完成后输出分隔线。

- 再次调用 `doWork()` 函数制作茶。

5. 主函数

- 在 `main()` 函数中调用 `test01()` 函数,启动测试流程。

- 返回 0 表示程序正常结束。 通过这种设计,代码实现了制作不同饮品的通用流程,同时利用多态性可以根据传入的具体饮品对象执行相应的制作步骤。

 代码实现:

#include<iostream>
using namespace std; class AbstractDrinking{public://煮水 virtual void Boil() = 0;//冲泡 virtual void Brew() = 0;//倒入杯中virtual void PourInCup() = 0;//加入辅料virtual void PutSomething() = 0; //制作饮品void makeDrink(){Boil();Brew();PourInCup();PutSomething(); } 
};class Coffee :public AbstractDrinking{public://煮水virtual void Boil(){cout << "煮开水" << endl;} //加入辅料virtual void Brew(){cout << "冲泡咖啡" << endl;} //倒入杯中 virtual void PourInCup(){cout << "倒入杯中" << endl;} //加入辅料virtual void PutSomething(){cout << "加入糖和牛奶" << endl;} 
};class Tee :public AbstractDrinking{public://煮水virtual void Boil(){cout << "煮开水" << endl;} //加入辅料virtual void Brew(){cout << "冲泡茶叶" << endl;} //倒入杯中 virtual void PourInCup(){cout << "倒入杯中" << endl;} //加入辅料virtual void PutSomething(){cout << "加入柠檬" << endl;} 
};void doWork(AbstractDrinking * abs){abs->makeDrink();delete abs;
}void test01(){doWork(new Coffee);cout << "-----------------" << endl;doWork(new Tee);
}int main(){test01();return 0;
} 

相关文章:

类和对象—多态—案例2—制作饮品

案例描述&#xff1a; 制作饮品的大致流程为&#xff1a;煮水-冲泡-倒入杯中-加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作产品基类&#xff0c;提供子类制作咖啡和茶叶 思路解析&#xff1a; 1. 定义抽象基类 - 创建 AbstractDrinking 抽象类&#xff0c;该类…...

嵌入式产品级-超小尺寸游戏机(从0到1 硬件-软件-外壳)

Ultra-small size gaming console。 超小尺寸游戏机-Pico This embedded product is mainly based on miniaturization, followed by his game functions are also very complete, for all kinds of games can be played, and there will be relevant illustrations in the fo…...

计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

前端开发10大框架深度解析

摘要 在现代前端开发中&#xff0c;框架的选择对项目的成功至关重要。本文旨在为开发者提供一份全面的前端框架指南&#xff0c;涵盖 React、Vue.js、Angular、Svelte、Ember.js、Preact、Backbone.js、Next.js、Nuxt.js 和 Gatsby。我们将从 简介、优缺点、适用场景 以及 实际…...

Mybatis 的关联映射(一对一,一对多,多对多)

前言 在前面我们已经了解了&#xff0c;mybatis 的基本用法&#xff0c;动态SQL&#xff0c;学会使用mybatis 来操作数据库。但这些主要操作还是针对 单表实现的。在实际的开发中&#xff0c;对数据库的操作&#xff0c;常常涉及多张表。 因此本篇博客的目标&#xff1a;通过my…...

深度解码!清华大学第六弹《AIGC发展研究3.0版》

在Grok3与GPT-4.5相继发布之际&#xff0c;《AIGC发展研究3.0版》的重磅报告——这份长达200页的行业圣经&#xff0c;不仅预测了2025年AI技术爆发点&#xff0c;更将「天人合一」的东方智慧融入AI伦理建构&#xff0c;堪称数字时代的《道德经》。 文档&#xff1a;清华大学第…...

/dev/console文件详解

/dev/console概览 /dev/console 是 Linux 系统中的一个特殊设备文件&#xff0c;通常用于与系统的控制台进行交互。它的作用和特点如下&#xff1a; 1. 作用 init 进程&#xff08;PID 1&#xff09;和某些系统服务在启动时会使用 /dev/console 进行日志输出&#xff0c;以确…...

ProfibusDP主站转ModbusTCP网关如何进行数据互换

ProfibusDP主站转ModbusTCP网关如何进行数据互换 在现代工业自动化领域&#xff0c;通信协议的多样性和复杂性不断增加。Profibus DP作为一种经典的现场总线标准&#xff0c;广泛应用于工业控制网络中&#xff1b;而Modbus TCP作为基于以太网的通信协议&#xff0c;因其简单易…...

springboot3 WebClient

1 介绍 在 Spring 5 之前&#xff0c;如果我们想要调用其他系统提供的 HTTP 服务&#xff0c;通常可以使用 Spring 提供的 RestTemplate 来访问&#xff0c;不过由于 RestTemplate 是 Spring 3 中引入的同步阻塞式 HTTP 客户端&#xff0c;因此存在一定性能瓶颈。根据 Spring 官…...

牛客周赛 Round 83

A.和猫猫一起起舞&#xff01; 思路&#xff1a;遇到‘U’和‘D’&#xff0c;输出‘R’或者‘L’&#xff1b;遇到‘R’和‘L’&#xff0c;输出‘U’或者‘D’.(这题比较简单) AC代码&#xff1a; void solve() {int n, m, k;char ch;cin >> ch;if (ch U || ch D)…...

硬通货用Deekseek做一个Vue.js组件开发的教程

安装 Node.js 与 Vue CLI‌ npm install -g vue/cli vue create my-vue-project cd my-vue-project npm run serve 通过 Vue CLI 可快速生成项目骨架&#xff0c;默认配置适合新手快速上手 目录结构‌ src/ ├── components/ # 存放组件文件 │ └── …...

Windows权限维持之利用安全描述符隐藏服务后门进行权限维持(八)

我们先打开cs的服务端 然后我们打开客户端 我们点击连接 然后弹出这个界面 然后我们新建一个监听器 然后我们生成一个beacon 然后把这个复制到目标主机 然后我们双击 运行 然后cs这边就上线了 然后我们把进程结束掉 然后我们再把他删除掉 然后我们创建服务 将后门程序注册…...

Ubuntu20.04双系统安装及软件安装(七):Anaconda3

Ubuntu20.04双系统安装及软件安装&#xff08;七&#xff09;&#xff1a;Anaconda3 打开Anaconda官网&#xff0c;在右侧处填写邮箱&#xff08;要真实有效&#xff01;&#xff09;&#xff0c;然后Submit。会出现如图示的Success界面。 进入填写的邮箱&#xff0c;有一封Ana…...

【极光 Orbit•STC8A-8H】02. STC8 单片机工程模板创建

【极光 Orbit•STC8A-8H】02. STC8 单片机工程模板创建 七绝单片机 小小芯片大乾坤&#xff0c; 集成世界在其中。 初学虽感千重难&#xff0c; 实践方知奥妙通。 今天的讲法和过去不同&#xff0c;直接来一个多文件模块化的工程模板创建&#xff0c;万事开头难&#xff0c;…...

Spring Boot WebFlux 中 WebSocket 生命周期解析

Spring Boot WebFlux 中的 WebSocket 提供了一种高效、异步的方式来处理客户端与服务器之间的双向通信。WebSocket 连接的生命周期包括连接建立、消息传输、连接关闭以及资源清理等过程。此外&#xff0c;为了确保 WebSocket 连接的稳定性和可靠性&#xff0c;我们可以加入重试…...

PostgreSQL中的事务隔离

1. 事务隔离的概念 在数据库管理系统中&#xff0c;事务隔离是一项重要的功能&#xff0c;它能确保在并发访问数据库时事务之间能够独立运行&#xff0c;不会相互干扰。数据库系统通常支持不同级别的事务隔离&#xff0c;用来满足不同应用程序之间的需求。 2. 事务隔离的种类…...

基于Rye的Django项目通过Pyinstaller用Github工作流简单打包

前言 Rye的介绍和安装 Ryehttps://rye.astral.sh/Rye 完整使用教程_安装rye-CSDN博客https://blog.csdn.net/zhenndbc/article/details/144544692 正文 项目建立 配置好环境后 新建文件夹 新建文件夹&#xff0c;进入项目 初始化 rye init下载依赖 rye syncpycharm 打…...

ubuntu 20.04 C++ 源码编译 cuda版本 opencv4.5.0

前提条件是安装好了cuda和cudnn 点击下载&#xff1a; opencv_contrib4.5.0 opencv 4.5.0 解压重命名后 进入opencv目录&#xff0c;创建build目录 “CUDA_ARCH_BIN ?” 这里要根据显卡查询一下,我的cuda是11&#xff0c;显卡1650&#xff0c;所以是7.5 查询链接&#xff1a;…...

【VUE】第一期——初使用、基本语法

目录 0 前言 1 准备工作 1.1 创建vue实例 1.2 vue开发者工具 2 插值表达式 2.1 基本用法 3 常用指令 3.1 内容渲染指令 3.1.1 v-text 3.1.2 v-html 3.2 条件渲染指令 3.2.1 v-show 3.2.2 v-if 3.2.3 v-else 和 v-else-if 3.3 事件绑定指令 3.3.1 内联语句 3.3…...

计算光学成像与光学计算概论

计算光学成像所涉及研究的内容非常广泛&#xff0c;虽然计算光学成像的研究内容是发散的&#xff0c;但目的都是一致的&#xff1a;如何让相机记录到客观实物更丰富的信息&#xff0c;延伸并扩展人眼的视觉感知。总的来说&#xff0c;计算光学成像现阶段已经取得了很多令人振奋…...

自托管小说创作平台部署指南:从Docker到API集成

1. 项目概述&#xff1a;一个为小说创作者量身打造的全能工具箱最近在折腾一个个人项目&#xff0c;想搭建一个私有的、功能全面的小说创作与管理平台。作为一个深度文字爱好者兼技术从业者&#xff0c;我受够了在各种零散的文档、表格和笔记软件之间来回切换&#xff0c;也厌倦…...

如何快速解决AKShare股票数据获取失败:完整的数据采集优化指南

如何快速解决AKShare股票数据获取失败&#xff1a;完整的数据采集优化指南 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcode.com/gh_mirror…...

Seraphine:5大核心技术构建的智能英雄联盟战绩查询与决策系统

Seraphine&#xff1a;5大核心技术构建的智能英雄联盟战绩查询与决策系统 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine Seraphine是一款基于Python和PyQt5开发的高效智能开源英雄联盟战绩查询工具&#xff…...

Flutter聊天UI组件库flutter_chat_ui:快速构建高质量聊天界面

1. 项目概述与核心价值如果你正在用Flutter开发一个聊天应用&#xff0c;并且不想从零开始手搓UI组件&#xff0c;那么flyerhq/flutter_chat_ui这个开源库&#xff0c;绝对值得你花时间研究一下。它不是一个完整的聊天SDK&#xff0c;不负责消息的发送、接收和存储&#xff0c;…...

Threadline MCP:基于消息协议的线程管理与任务编排框架解析

1. 项目概述&#xff1a;从“Threadline MCP”看现代应用架构的线程管理革新最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“vidursharma202-del/threadline-mcp”。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但拆解一下&#xff0c;“threadline”直译是…...

GAD7980 ADC在振动数据采集中的实战应用与设计要点

1. 项目概述&#xff1a;为什么我们需要“快、精、高”的振动数据采集&#xff1f;在工业设备状态监测、精密仪器分析乃至消费电子性能评估领域&#xff0c;振动数据就像设备的“心电图”。它直接反映了机械结构的健康状况、运动部件的平衡性以及系统运行的稳定性。过去&#x…...

修音翻车现场实录:用Melodyne选择工具时,这3个坑我劝你别踩

Melodyne修音避坑指南&#xff1a;选择工具三大致命操作误区解析 第一次用Melodyne修人声时&#xff0c;我对着屏幕上的波形信心满满地拖动音符&#xff0c;结果导出的音频听起来像电子合成器故障——音高扭曲、节奏支离破碎。后来才发现&#xff0c;问题都出在那个看似简单的…...

基于CircuitPython与NeoPixel的桌面俄罗斯方块游戏机DIY全攻略

1. 项目概述与核心思路几年前&#xff0c;我在麻省理工学院&#xff08;MIT&#xff09;的校园里第一次看到那座著名的“绿楼”&#xff08;Green Building&#xff09;外墙上的巨型俄罗斯方块游戏时&#xff0c;就被深深震撼了。那不仅仅是一个游戏&#xff0c;更是一种将冰冷…...

原神帧率解锁终极指南:免费突破60FPS限制的完整教程

原神帧率解锁终极指南&#xff1a;免费突破60FPS限制的完整教程 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 原神帧率解锁工具&#xff08;genshin-fps-unlock&#xff09;是一款开源…...

array_partition 怎么解决 Bank 冲突

1. complete 完全分区 把数组彻底打散&#xff0c;每个元素独立寄存器&#xff0c;不再占用 BRAM、无 Bank 概念&#xff0c;彻底消除冲突。 适合&#xff1a;小数组、高并行、要求 II1。 2. block 块分区 把数组平均切成若干大块&#xff0c;每块映射到独立 Bank&#xff0c;跨…...