多态案例三-电脑组装

2023-11-02

案例描述:

电脑主要组成部件为 CPU(用于计算),显卡(用于显示),内存条(用于存储)将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口测试时组装三台不同的电脑进行工作。
示例:

#include<iostream>
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)
	{
		m_cpu = cpu;
		m_vc = vc;
		m_mem = mem;
	}

	//提供工作的函数
	void work()
	{
		//让零件工作起来,调用接口
		m_cpu->calculate();

		m_vc->display();

		m_mem->storage();
	}

	//提供析构函数 释放3个电脑零件
	~Computer()
	{

		//释放CPU零件
		if (m_cpu != NULL)
		{
			delete m_cpu;
			m_cpu = NULL;
		}

		//释放显卡零件
		if (m_vc != NULL)
		{
			delete m_vc;
			m_vc = NULL;
		}

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

private:

	CPU * m_cpu; //CPU的零件指针
	VideoCard * m_vc; //显卡零件指针
	Memory * m_mem; //内存条零件指针
};

//具体厂商
//Intel厂商
class IntelCPU :public CPU
{
public:
	virtual void calculate()
	{
		cout << "Intel的CPU开始计算了!" << endl;
	}
};

class IntelVideoCard :public VideoCard
{
public:
	virtual void display()
	{
		cout << "Intel的显卡开始显示了!" << endl;
	}
};

class IntelMemory :public Memory
{
public:
	virtual void storage()
	{
		cout << "Intel的内存条开始存储了!" << endl;
	}
};

//Lenovo厂商
class LenovoCPU :public CPU
{
public:
	virtual void calculate()
	{
		cout << "Lenovo的CPU开始计算了!" << endl;
	}
};

class LenovoVideoCard :public VideoCard
{
public:
	virtual void display()
	{
		cout << "Lenovo的显卡开始显示了!" << endl;
	}
};

class LenovoMemory :public Memory
{
public:
	virtual void storage()
	{
		cout << "Lenovo的内存条开始存储了!" << endl;
	}
};


void test01()
{
	//第一台电脑零件
	CPU * intelCpu = new IntelCPU;
	VideoCard * intelCard = new IntelVideoCard;
	Memory * intelMem = new IntelMemory;

	cout << "第一台电脑开始工作:" << endl;
	//创建第一台电脑
	Computer * computer1 = new Computer(intelCpu, intelCard, intelMem);
	computer1->work();
	delete computer1;

	cout << "-----------------------" << endl;
	cout << "第二台电脑开始工作:" << endl;
	//第二台电脑组装
	Computer * computer2 = new Computer(new LenovoCPU, new LenovoVideoCard, new LenovoMemory);;
	computer2->work();
	delete computer2;

	cout << "-----------------------" << endl;
	cout << "第三台电脑开始工作:" << endl;
	//第三台电脑组装
	Computer * computer3 = new Computer(new LenovoCPU, new IntelVideoCard, new LenovoMemory);;
	computer3->work();
	delete computer3;

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多态案例三-电脑组装 的相关文章

  • Unity3D StartCoroutine 调用一个函数,该函数什么时候返回?

    我知道Unity3D StartCoroutine调用了一个与StartCoroutine在同一线程上运行的函数 但是被调用的函数什么时候返回到原始调用者 我在互联网上查找了一个很好的 Unity3D Coroutine 示例 但找不到完整
  • DispatcherTimer 未按时执行

    我正在使用 c 中的 DispatchTimer 编写一个时钟应用程序 但由于某些原因 我的时钟似乎时不时地跳过 1 秒 例如 52 秒 gt 54 秒 跳过 53 秒 在我看来 计时器并不是每秒都执行一次 DispatcherTimer
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • 在通过网络发送之前压缩位图

    我正在尝试通过网络发送位图屏幕截图 因此我需要在发送之前对其进行压缩 有一个库或方法可以做到这一点吗 当您将图像保存到流时 您have选择一种格式 几乎所有位图格式 bmp gif jpg png 都使用一种或多种压缩形式 因此 只需选择适
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • Dynamics Crm:获取状态代码/状态代码映射的元数据

    在 Dynamics CRM 2011 中 在事件实体上 状态原因 选项集 也称为状态代码 与 状态 选项集 也称为状态代码 相关 例如看这个截图 当我使用 API 检索状态原因选项集时 如下所示 RetrieveAttributeRequ
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • ChatGPT+小红书爆文,牛!

    随着AI技术的不断发展 它已经逐渐渗透到了我们的生活之中 包括内容营销领域 我们通过AI算法生成文本 优化搜索引擎排名 提高用户体验等 现在AI已逐渐在改变时代的进步 AI也将成为下一个十年的一个变革 我们每个创业者 内容创作者以及普通人都
  • Visual Studio 卸载 Visual Assist番茄助手

    在VS的Visual Studio 2010 Extension Manager 中可卸载 详细可参考文章 https blog csdn net fangxinggood article details 6052950
  • Selenium常用操作之单选复选框、下拉列表、键盘、截屏、断言、(显式隐式)等待

    目录 1 窗口最大化 2 单选框操作 3 复选框操作 4 下拉列表 5 selenium 三种等待 6 键盘操作 7 截屏 8 断言 9 Selenium操作JS弹窗控件 10 鼠标悬停与释放 1 窗口最大化 driver maximize
  • 算法03-任务混部

    公司创新实验室正在研究如何最小化资源成本 最大化资源利用率 请你设计算法帮他们 解决一个任务混部问题 有 taskNum 项任务 每个任务有开始时间 startTime 结束时间 endTime 并行度 parallelism 三个属性 并
  • 福建中烟RFID托盘运输环节的出入库管理

    1 项目设计 在木托盘上加一张带有RFID芯片的纸滑托盘 利用专用推拉器RFID智能叉车将纸滑托盘连同放在其上面的整托盘卷烟叉起 经过出库扫描仪扫描芯片信息后装车 便完成了基于RFID托盘运输环节的出入库作业 基于工业的RFID托盘运输管理
  • C/C++编程:名称

    两个概念 如果一个名称使用域解析符 或者成员访问运算符 gt 来显式表明它所属的作用域 我们就称该名称为受限名称 this gt count是受限名称 count不是 即使count实际上引用的也是一个类名称 如果一个名称 以某种方式 依赖
  • 如何基于 Kubernetes 实现优质开发者平台体验?

    内部开发者平台 或 IDP 是使开发团队能够更快 更轻松 更一致地交付应用程序的基础设施 Kubernetes 本身是一个功能强大的平台 但它引入了太多复杂性和功能 因此不能简单地将其作为 IDP 交给开发团队 若要期望他们能取得成功 非常
  • QString 乱谈(3)-Qt5与中文

    两个月前 简单写过QTextCodec中的setCodecForTr等终于消失了 Qt5 在Qt论坛上 不少用户都对去掉这两个函数表示特别的不了解 为什么会这样 我想多少能说明不少用户对C 中源码字符集和执行字符集的不太了解 从而造成对这种
  • SQL查询~ 存在一个表而不在另一个表中的数据

    A B两表 找出ID字段中 存在A表 但是不存在B表的数据 A表总共13w数据 去重后大约3W条数据 B表有2W条数据 且B表的ID字段有索引 方法一 使用 not in 容易理解 效率低 执行时间为 1 395秒 1 select dis
  • 微信小程序中调用手机拨号功能

    在微信小程序中 如何实现点击电话按钮后跳转至手机的拨号界面 并且传入指定的号码 要实现在微信小程序中点击电话按钮后跳转至手机的拨号界面 并传入指定的号码 你可以使用 wx makePhoneCall 方法 微信小程序中调用手机拨号功能 首先
  • Netty编程面试题

    1 Netty 是什么 Netty是 一个异步事件驱动的网络应用程序框架 用于快速开发可维护的高性能协议服务器和客户端 Netty是基于nio的 它封装了jdk的nio 让我们使用起来更加方法灵活 2 Netty 的特点是什么 高并发 Ne
  • java数组定义错误_JAVA定义数组 int a[]=new int[100000] 错误

    我用JAVA定义了一个1W的数组可以使用 但是定义一个10W的数组提示Exceptioninthread main java lang ArrayIndexOutOfBoundsException 2147479015atJavaappli
  • php微信企业付款到银行卡获取RSA加密公钥

    微信企业付款到银行卡需要对收款方银行卡号 收款方用户名进行加密 这个过程需要获取到加密公钥 对于一些第一次接刚触到的小伙伴来说 可能比较陌生 在此记录一下自己生成 RSA公钥的过程 1 调用官方提供的接口 接口默认输出PKCS 1格式的公钥
  • 可视化库D3.js(1)-入门篇

    从今天开始可视化库 D 3 j s color red D3 js D3 js的第一章 入门篇咯 什么是D3 js D3指的是Data Dri
  • Mybatis插件原理和PageHelper结合实战分页插件

    今天和大家分享下mybatis的一个分页插件PageHelper 在讲解PageHelper之前我们需要先了解下mybatis的插件原理 PageHelper 的官方网站 https github com pagehelper Mybati
  • I/O多路复用之epoll

    关注公众号 高性能架构探索 后台回复 pdf 免费获取计算机必备经典书籍 epoll是一种事件轮询 是Linux特有的 它允许一个进程监视多个文件描述符 并在对它们进行I O操作时获取通知 它允许边缘触发和级别触发通知 在我们研究epoll
  • 跟奥巴马一起编程

    1036 跟奥巴马一起编程 15 15 point s 美国总统奥巴马不仅呼吁所有人都学习编程 甚至以身作则编写代码 成为美国历史上首位编写计算机代码的总统 2014年底 为庆祝 计算机科学教育周 正式启动 奥巴马编写了很简单的计算机代码
  • virtualbox无法创建64虚拟机的解决办法

    最近打算学习一下hadoop 需要用以虚拟机 由于vmware太大 故选择了oracle的virtualbox 结果装上virtualbox后只能创建32位的虚拟机 如下图 在网上百度了一把 说是需要 改Bioss的设置 进入securit
  • MATLAB打开.m文件乱码解决办法

    Matlab打开 m文件出现中文乱码问题 是因为Matlab存在两种编码格式 GBK和UTF 8 而不同版本的Matlab编码格式可能不统一 因此在不同版本的Matlab打开文件 由于编码格式的改变 会导致注释乱码 1 查看你的Matlab
  • 多态案例三-电脑组装

    案例描述 电脑主要组成部件为 CPU 用于计算 显卡 用于显示 内存条 用于存储 将每个零件封装出抽象基类 并且提供不同的厂商生产不同的零件 例如Intel厂商和Lenovo厂商创建电脑类提供让电脑工作的函数 并且调用每个零件工作的接口测试