多态应用实例

目录

  • 多态优点
  • 1.模拟冲泡饮品过程
  • 2.电脑组装

在这里插入图片描述

多态优点

多态的优点:

  • 代码组织结构清晰;
  • 可读性强;
  • 利于前期和后期的扩展以及维护。

如果想扩展新的功能,不需要修改源码,遵循开发中开闭原则,只需在补充所需对象,直接调用即可。
开闭原则:对扩展进行开放,对修改进行关闭。

总结:C++开发提倡利用多态设计程序架构,因为多态优点很多

1.模拟冲泡饮品过程

案例描述:

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

#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 Tea : 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* drink) {
	drink->MakeDrink();
	delete drink;
}

void test01() {
	DoWork(new Coffee);
	cout << "--------------" << endl;
	DoWork(new Tea);
}

int main() {

	test01();
	system("pause");
	return 0;
}

在这里插入图片描述

2.电脑组装

案例描述:

电脑主要组成部件为 CPU(用于计算),显卡(用于显示),内存条(用于存储);

将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商…
创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口;
测试组装三台不同的电脑进行工作.

总代码:

#include<iostream>
using namespace std;

//抽象零件类
class CPU
{
public:
	//抽象CPU计算函数
	virtual void calculate() = 0;//纯虚函数
};

class Graphics_card//显卡
{
public:
	//抽象显卡显示函数
	virtual void display() = 0;//纯虚函数
};

class Memory
{
public:
	//抽象内存存储函数
	virtual void storage() = 0;//纯虚函数
};

 
//生产厂商
//Intel厂商生产零件类
class IntelCpu:public CPU
{
public:
	void calculate()
	{
		cout << "Intel的CPU提供计算!" << endl;
	}

};

 class IntelCard :public Graphics_card
 {
 public:
	 void display()
	 {
		 cout << "Intel的显卡提供显示!" << endl;
	 }
 };

 class IntelMem : public Memory
 {
 public:
	  void storage()
	 {
		 cout << "Intel的内存条提供存储!" << endl;
	 }
 };


 //Lenovo厂商生产零件类
 class LenovoCpu :public CPU
 {
 public:
	 void calculate()
	 {
		 cout << "Lenovo的CPU提供计算!" << endl;
	 }

 };

 class LenovoCard :public Graphics_card
 {
 public:
	 void display()
	 {
		 cout << "Lenovo的显卡提供显示!" << endl;
	 }
 };

 class LenovoMem : public Memory
 {
 public:
	 void storage()
	 {
		 cout << "Lenovo的内存条提供存储!" << endl;
	 }
 };


class Computer
{
public:
	//初始化:选择零件厂商
	Computer(CPU* cpu,Graphics_card* card,Memory* mem)
	{
		m_cpu=cpu;
		m_card=card;
	    m_mem=mem;
	}

	//执行工作
	void func()
	{
		//零件工作,调用接口
		m_cpu->calculate();
		m_card->display();
		m_mem->storage();
	}

	//释放三个零件所开辟的空间
	~Computer()
	{
		//释放CPU零件
		if (m_cpu != NULL)
		{
			delete m_cpu;
			m_cpu = NULL;
		}
		//释放显卡零件
		if (m_card != NULL)
		{
			delete m_card;
			m_card = NULL;
		}

		//释放内存条零件
		if (m_mem != NULL)
		{
			delete m_mem;
			m_mem = NULL;
		}
	}

private:
	//各零件指针
	CPU* m_cpu;
	Graphics_card* m_card;
	Memory* m_mem;
};

void test01()
{
//第一台电脑零件——全部Intel零件
	CPU* intelCpu = new IntelCpu;
	Graphics_card* intelCard = new IntelCard;
	Memory * intelMem= new IntelMem;
	cout << "第一台电脑开始工作:" << endl;
	//创建第一台电脑
	Computer* computer1 = new Computer(intelCpu,intelCard,intelMem);
	computer1->func();
	delete computer1;

	cout << "-----------------------" << endl;
//第二台电脑零件——全部Lenovo零件
	CPU* lenovoCpu = new LenovoCpu;
	Graphics_card* lenovoCard = new LenovoCard;
	Memory* lenovoMem = new LenovoMem;
	cout << "第二台电脑开始工作:" << endl;
	//创建第一台电脑
	Computer* computer2 = new Computer(lenovoCpu, lenovoCard, lenovoMem);
	computer2->func();
	delete computer2;

	cout << "-----------------------" << endl;
//第三台电脑零件——混合Intel和Lenovo零件
	cout << "第三台电脑开始工作:" << endl;
	//创建第一台电脑
	Computer* computer3 = new Computer(new LenovoCpu, new IntelCard, new LenovoMem);
	computer3->func();
	delete computer3;
}

int main()
{
	test01();

	system("pause");
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yml配置文件怎么引用pom.xml中的属性

目录 前言配置测试 前言 配置文件中的一些参数有时要用到pom文件中的属性&#xff0c;做到pom文件变配置文件中也跟着变&#xff0c;那如何才能做到呢&#xff0c;下面咱们来一起探讨学习。 配置 1.首先要在pom.xml中做如下配置&#xff0c;让maven渲染src/main/resources下配…

性能优化(CPU优化技术)-NEON 介绍

「发表于知乎专栏《移动端算法优化》」 本节主要介绍基本 SIMD 及其他的指令流与数据流的处理方式&#xff0c;NEON 的基本原理、指令以及与其他平台及硬件的对比。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;…

【力扣】记录一下竞赛分上 Knight

记录一下力扣上 Knight 力扣的题还是相对来说比较简单的&#xff0c;前两个月写的题多一点&#xff0c;后面几乎都是只做了每日一题&#xff0c;感觉正常来说刷个两三个月的题水平就差不多够了&#xff0c;甚至在我才刷半个月的时候就可以做三题了&#xff0c;排名和现在差不多…

vue3源码(二)reactiveeffect

一.reactive与effect功能 reactive方法会将对象变成proxy对象&#xff0c; effect中使用reactive对象时会进行依赖收集&#xff0c;稍后属性变化时会重新执行effect函数。 <div id"app"></div><script type"module">import {reactive,…

2024年需要重点关注的15种计算机病毒

2024年&#xff0c;计算机病毒威胁变得愈发多元化和复杂化。涉及勒索病毒、二维码病毒、挖矿木马等15种类型&#xff0c;这些病毒从数据勒索到系统入侵&#xff0c;对全球网络安全构成严峻挑战。 2024年&#xff0c;计算机病毒威胁变得愈发多元化和复杂化。涉及勒索病毒、二维码…

Java 报错java.Net.UnknownHostException:raw.githubusercontent.com

1.问题 今天在vscode 学习如何使用 plantUML生成图片的时候&#xff0c;发生错误 java.util.concurrent.ExecutionException: java.net.UnknownHostException: raw.githubusercontent.com issue raw.githubusercontent.com java.util.concurrent.ExecutionException: java.n…

vulhub之Zabbix篇

CVE-2016-10134--SQL注入 一、漏洞介绍 zabbix是一款服务器监控软件&#xff0c;其由server、agent、web等模块组成&#xff0c;其中web模块由PHP编写&#xff0c;用来显示数据库中的结果。 漏洞环境 在vulhub靶场进行复现&#xff0c;启动zabbix 3.0.3。 二、复现步骤 1…

JL-03-Q6 校园气象站

产品概述 校园气象站针对测量与环境、科学研究等相关的气象指标进行设计制造&#xff0c;气象站对采集数据信息以图表、数据的形式真实、直观的反应当前环境数据指标。可通过各种传感器对气压、气温、相对湿度、风向、风速、雨量、太阳辐射、乃至空气质量等要素进行采集、存储…

Type-C平板接口协议芯片介绍,实现单C口充放电功能

在现代平板电脑中&#xff0c;Type-C接口已经成为了一个非常常见的接口类型。相比于传统的USB接口&#xff0c;Type-C接口具有更小的体积、更快的传输速度和更方便的插拔体验。但是&#xff0c;在使用Type-C接口的平板电脑上&#xff0c;如何实现单C口充电、放电和USB2.0数据传…

【后端技术】术有千法,道本归一

目录 1.概述 2.机器的问题 2.1.计算 2.2.存储 2.3.传输 3.人的问题 3.1.代码工程的管理 3.2.过程的把控 4.总结 1.概述 术有千法&#xff0c;道本归一。 之所以这样说&#xff0c;是因为当前出现的纷繁复杂的后端技术&#xff0c;其本质其实都是为了解决同一套问题。…

C++:迭代器失效问题

目录 1.vector迭代器失效问题 1.底层空间改变 ​编辑 2.指定位置元素的删除操作 2.Linux下的迭代器失效检测 1.扩容 2.删除 3.解决方法 1.vector迭代器失效问题 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就是一个指针&#xff0c;或者是…

uniapp设置隐藏原生导航栏(3)

1、单个页面隐藏 在pages.json里配置 (第一种方式) {"path": "pages/home/index","style": {"navigationBarTitleText": "首页","navigationStyle": "custom" // 使用自定义导航栏&#xff0c;系统会关…

LoadRunner从零开始之走近LoadRunner

3.1 LoadRunner 的运行原理 安装LoadRunner 后&#xff0c;在菜单“开始” 一“MercuryLoadRunner” 中&#xff0c;你会看 到这样一组程序&#xff0c;如图 3-1 所示。 • 其中Applications 下面的Analysis、Controller 和Virtual User Generator 是我们 做性能测试最常用的…

【基础配置】Python2/Python3并存安装配置教程

Nx01 产品简介 Python是一种高级的、解释型的、面向对象的通用编程语言&#xff0c;具有简单易学、代码可读性强、功能强大、可移植性好等特点。它可以应用于多种领域&#xff0c;如Web开发、数据科学、人工智能、机器学习、科学计算、自动化测试等。Python由Guido van Rossum于…

08章【文件与IO】

文章目录 File类IO流字节流字符流字节字符转换流缓冲流打印流对象流字节数组流数据流字符串流、管道流、合并流 RandomAccessFileProperties文件操作文件压缩与解压缩装饰者模式常见字符编码New IO File类 File类的基本概念 File类&#xff1a;表示文件和目录路径名的抽象表示…

【AIGC】CLIP

CLIP的基本原理 对比学习&#xff1a; Clip使用对比学习来训练模型。对比学习的目标是通过将正样本&#xff08;相似的图像和文本对&#xff09;与负样本&#xff08;不相似的图像和文本对&#xff09;进行比较&#xff0c;从而使模型学会区分不同样本之间的差异。这有助于模型…

仰暮计划|“每个人三发子弹,我打中两靶子,还有一发子弹让我打到红薯地里了”

“百善孝为先”&#xff0c;爱老、敬老一直是我们的优秀传统文化&#xff0c;一直是流淌在我们体内的文化基因。中国历朝历代有着丰富的养老文化&#xff0c;还有一系列的爱老敬老政策。无论是从周代创建的养老礼制度&#xff0c;还是春秋时期开始的古代养老文化&#xff0c;亦…

C#使用IsLeapYear方法判断指定年份是否为闰年

目录 一、判断指定年是否为闰年的2个方法 1.使用IsLeapYear方法判断指定年份是否为闰年 2.使用自定义的算法计算指定年份是否为闰年 二、示例 1.方法1的实例 2.方法2的实例 一、判断指定年是否为闰年的2个方法 1.使用IsLeapYear方法判断指定年份是否为闰年 使用IsLeapY…

C语言进阶——数据结构之链表(续)

前言 hello&#xff0c;大家好呀&#xff0c;我是Humble&#xff0c;本篇博客承接之前的C语言进阶——数据结构之链表 的内容&#xff08;没看过的小伙伴可以从我创建的专栏C语言进阶之数据结构 找到那篇文章并阅读后在回来哦~&#xff09;&#xff0c;上次我们重点说了链表中…

2023年智能可穿戴行业市场分析(电商数据查询分析):智能手表销额增长21%,手环明显下滑

近年来&#xff0c;随着技术的进步&#xff0c;智能可穿戴设备在社交网络、医疗保健、导航等诸多领域有着非常广泛的应用&#xff0c;这为大众生活带来了诸多便利。 当前的可穿戴产品形态纷繁多样&#xff0c;主要包括智能手表、智能眼镜、智能手环、健康穿戴和体感控制等等&am…