《c++》多态案例一.电脑组装

一.代码展示

#include <iostream>
using namespace std;
class CPU {
public://抽象计算函数virtual void calculate() = 0;};class CVideoCard {
public://抽象显示函数virtual void display() = 0;};
class Memory {
public://抽象存储函数virtual void storage() = 0;};class Computer {
public:Computer(CPU* cpu, CVideoCard* vc, Memory* mem) {m_cpu = cpu;m_vc = vc;m_mem = mem;}//提供工作函数void doWork() {m_cpu->calculate();m_vc->display();m_mem->storage();}//析构函数~Computer() {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的零件指针CVideoCard* m_vc;//显卡的零件指针Memory* m_mem;//内存条的零件指针};class IntelCPU : public CPU 
{
virtual void calculate() 
{cout << "Intel CPU 正在计算" << endl;
}
};class IntelVideoCard : public CVideoCard 
{
virtual void display() 
{cout << "Intel 显卡正在显示" << endl;
}};class IntelMemory : public Memory 
{
virtual void storage() 
{cout << "Intel 内存条正在存储" << endl;
}};class AmdCPU : public CPU 
{
virtual void calculate() 
{cout << "Amd CPU 正在计算" << endl;
}
};class AmdVideoCard : public CVideoCard {
virtual void display() {cout << "Amd 显卡正在显示" << endl;
}
};class AmdMemory : public Memory {virtual void storage() {cout << "Amd 内存条正在存储" << endl;}
};void test01() {CPU* Intelcpu = new IntelCPU();CVideoCard* Intelvc = new IntelVideoCard();Memory* Intelmem = new IntelMemory();//组装第一台电脑Computer* c1 = new Computer(Intelcpu, Intelvc, Intelmem);c1->doWork();delete c1;cout << "----------------------" << endl;//组装第二台电脑CPU* Amdcpu = new AmdCPU();CVideoCard* Amdvc = new AmdVideoCard();Memory* Amdmem = new AmdMemory();Computer* c2 = new Computer(Amdcpu, Amdvc, Amdmem);c2->doWork();delete c2;}int main() {test01();return 0;
}

二.代码解析

2.1构建电脑各零件类

class CPU {
public://抽象计算函数virtual void calculate() = 0;};class CVideoCard {
public://抽象显示函数virtual void display() = 0;};
class Memory {
public://抽象存储函数virtual void storage() = 0;};

在这里用了组装电脑中比较重要的零件分别是CPU(处理器)Cvideocard(显卡)Memory(内存条)分别创建了3个类。

在每个类中都用到纯虚函数方便子类后续进行继承

纯虚函数是为了实现接口或抽象基类而设计的,强制派生类必须重写该函数。

2.2创建电脑类

class Computer {
public:Computer(CPU* cpu, CVideoCard* vc, Memory* mem) {m_cpu = cpu;m_vc = vc;m_mem = mem;}//提供工作函数void doWork() {m_cpu->calculate();m_vc->display();m_mem->storage();}//析构函数~Computer() {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的零件指针CVideoCard* m_vc;//显卡的零件指针Memory* m_mem;//内存条的零件指针};

1.创建变量

首先要在Computer类中创建3个零件的指针去接收传入的零件指针

private:CPU* m_cpu;//CPU的零件指针CVideoCard* m_vc;//显卡的零件指针Memory* m_mem;//内存条的零件指针

这里之所以用private(保护权限)是因为编程习惯,通常在一个类中存放变量的权限用private(保护权限)防止随意被更改。

2.创建构造函数

Computer(CPU* cpu, CVideoCard* vc, Memory* mem) {m_cpu = cpu;m_vc = vc;m_mem = mem;}

创建一个构造函数用来接受传入的CPU(处理器)、VideoCard(显卡) 以及 Memory(硬盘)的参数。

3.创建工作函数

//提供工作函数void doWork() {m_cpu->calculate();m_vc->display();m_mem->storage();}

创建一个工作函数(doWork),该函数主要功能是提示每个零件是否正常工作。在该函数中要调用每个零件的功能,列如在Cpu类中我们创建了一个calculate(计算)函数,那么我们就要在doWork函数中调用该功能。

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

4.创建析构函数

	//析构函数~Computer() {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;}}

首先要知道为什么要创建析构函数,因为我们创建了3个指针变量,而指针变量一般是存放在内存里的堆区里,在堆区中系统不会自动释放该内存,这就导致会很容易出现内存泄漏的情况,所以我要进行手动的释放内存。

2.3创建各品牌的零件


class IntelCPU : public CPU 
{
virtual void calculate() 
{cout << "Intel CPU 正在计算" << endl;
}
};class IntelVideoCard : public CVideoCard 
{
virtual void display() 
{cout << "Intel 显卡正在显示" << endl;
}};class IntelMemory : public Memory 
{
virtual void storage() 
{cout << "Intel 内存条正在存储" << endl;
}};class AmdCPU : public CPU 
{
virtual void calculate() 
{cout << "Amd CPU 正在计算" << endl;
}
};class AmdVideoCard : public CVideoCard {
virtual void display() {cout << "Amd 显卡正在显示" << endl;
}
};class AmdMemory : public Memory {virtual void storage() {cout << "Amd 内存条正在存储" << endl;}
};

1.Inter系列的零件


class IntelCPU : public CPU 
{
virtual void calculate() 
{cout << "Intel CPU 正在计算" << endl;
}
};

例如我们要创建一个inter系列的cpu,那首先创建一个类名为 InrelCPU

因为他是CPU类中的一个子类,所以要继承CPU类中的属性,也就是

class intelCPU : public CPU

因为在CPU类中我们创建了一个关于calculate(计算)的虚函数


class IntelCPU : public CPU 
{
virtual void calculate() 
{cout << "Intel CPU 正在计算" << endl;
}
};

因此子类也要使用这个虚函数,并给这个虚函数重载一下,所以代码为:
virtual void calculate() 
{
    cout << "Intel CPU 正在计算" << endl;
}


2.其他零件创建方式跟1相差不大,这里不再赘述

2.4创建一个主机


void test01() {CPU* Intelcpu = new IntelCPU();CVideoCard* Intelvc = new IntelVideoCard();Memory* Intelmem = new IntelMemory();//组装第一台电脑Computer* c1 = new Computer(Intelcpu, Intelvc, Intelmem);c1->doWork();delete c1;cout << "----------------------" << endl;//组装第二台电脑CPU* Amdcpu = new AmdCPU();CVideoCard* Amdvc = new AmdVideoCard();Memory* Amdmem = new AmdMemory();Computer* c2 = new Computer(Amdcpu, Amdvc, Amdmem);c2->doWork();delete c2;}

1.创建一个函数

如代码所示,首先创建一个test01函数用来测试。

2.创建各品牌零件

	CPU* Intelcpu = new IntelCPU();CVideoCard* Intelvc = new IntelVideoCard();Memory* Intelmem = new IntelMemory();

在这段代码中,CPU* Intelcpu = new IntelCPU();   
CVideoCard* Intelvc = new IntelVideoCard();
以及Memory* Intelmem = new IntelMemory();
这些语句分别创建了 IntelCPUIntelVideoCardIntelMemory 类的对象,并将它们的指针赋值给了 IntelcpuIntelvcIntelmem 指针变量。

这些对象的创建和赋值是为了模拟组装一台计算机所需的不同零件,其中 IntelCPU 代表 Intel 品牌的 CPU,IntelVideoCard 代表 Intel 品牌的显卡,IntelMemory 代表 Intel 品牌的内存条。

类似地,后续代码中的 AmdCPUAmdVideoCardAmdMemory 分别代表 AMD 品牌的 CPU、显卡和内存条。通过这种方式,你可以轻松地组装出不同品牌的计算机,并测试它们的工作状态。

3.组装一个电脑

Computer* c1 = new Computer(Intelcpu, Intelvc, Intelmem);c1->doWork();delete c1;

创建一个电脑类的对象名为 c1  将上文创建好的3个品牌零件赋值给c1。

赋值完成后调用c1中的doWork函数来检查电脑各零件是否在工作状态中。

最后创建完成电脑后记得释放内存

delete c1;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS的数学对象

数学对象 什么是数学对象&#xff1a;数学方面的‘函数’ 分别为&#xff1a;四舍五入、向上取整、向下取整、随机数 四舍五入 console.log(Math.round(20.8)) 向上取整 console.log(Math.floor(20.9)) 向下取整 console.log(Math.ceil(20.1)) 随机数 随机数 0-1 之间的…

yolov7代码 | model.named_models

文章目录 前言1. print(model)2. print(model.named_models)2.1 print(name)2.2 print(module)2.3 print(f"{name}:: {module}") 3. hasattr(module, weight) 前言 了解model.named_models&#xff0c;为剪枝做准备。 剪枝有一些层如果你不想剪掉&#xff0c;那就用…

linux 使用kubeadm安装部署K8S

上一节&#xff0c;安装了docker-20.10.14版本 安装kubeadm&#xff0c;kubelet和kubectl 由于版本更新频繁&#xff0c;这里指定版本号部署 yum install kubelet-1.23.4-0 kubeadm-1.23.4-0 kubectl-1.23.4-0 -y Loaded plugins: fastestmirror Repository epel is listed m…

提升自己最快的方式是什么?

提升自己最快的方式通常涉及到个人成长的各个方面&#xff0c;包括心理、情感、技能和知识等。根据查阅到的资料&#xff0c;以下是一些具体的方法和步骤&#xff0c;帮助你快速提升自己&#xff1a; 1. 培养屏蔽力 荷兰畅销书作家罗伊马丁纳提到&#xff0c;屏蔽力是个人成长…

实现恒功率控制丨极海APM32F035高压灌溉水泵参考方案

直流无刷电机用途广泛&#xff0c;具有高效节能、使用寿命长、运行可靠无电火花、结构简单易维护等性能优势&#xff0c;在办公设备、智能家居、消费家电、工业设备、医疗设备等领域已规模化落地。随着智能化技术与成本的持续优化&#xff0c;BLDC应用将进一步提升在各行业的渗…

OpenAI官宣,ChatGPT免登录使用

昨天&#xff0c;就在愚人节当天&#xff0c;OpenAI突然宣布ChatGPT3.5向所有人开放&#xff0c;意思是即使没有注册OpenAI的账号&#xff0c;也能体验ChatGPT&#xff0c;就像浏览器一样&#xff0c;联接即可使用。 消息一出&#xff0c;OpenAI的官网直接被大量的用户挤挂了。…

axios 封装 http 请求详解

前言 Axios 是一个基于 Promise 的 HTTP 库&#xff0c;它的概念及使用方法本文不过多赘述&#xff0c;请参考&#xff1a;axios传送门 本文重点讲述下在项目中是如何利用 axios 封装 http 请求。 一、预设全局变量 在 /const/preset.js 中配置预先设置一些全局变量 window.…

adobe stock会员开通付费付款订阅充值教程/adobe stock免费白嫖一个月

登录adobe stock的官网&#xff0c;点击你想要下载的视频&#xff0c;然后点击免费下载&#xff0c;我们点击免费试用按钮&#xff0c;可以看到非常贵&#xff0c;需要80美金一个月&#xff0c;用fomepay可以免费白嫖一个月 点击获取一张虚拟信用卡&#xff0c;就可以白嫖一个…

配mmdetection

1. 安装conda 链接后面补上 2. 装pytorch&#xff0c;版本别装错了 Start Locally | PyTorch用这里面的命令 nvcc --version看cuda版本&#xff08;实验室服务器是11.0&#xff0c;可以用这个11.8的 &#xff09; 检查torch和cuda版本的命令&#xff1a; import torch # …

C语言:二叉树的构建

目录 一、二叉树的存储 1.1 顺序存储 1.2 链式存储 二、二叉树的顺序结构及实现 2.1堆的概念及结构 2.2堆的构建 2.3堆的插入 2.4堆顶的删除 2.5堆的完整代码 三、二叉树的链式结构及实现 3.1链式二叉树的构建 3.2链式二叉树的遍历 3.2.1前序遍历 …

鸿蒙原OS开发实例:【ArkTS类库单次I/O任务开发】

Promise和async/await提供异步并发能力&#xff0c;适用于单次I/O任务的场景开发&#xff0c;本文以使用异步进行单次文件写入为例来提供指导。 实现单次I/O任务逻辑。 import fs from ohos.file.fs; import common from ohos.app.ability.common;async function write(data:…

计算机学生求职简历的一些想法

面试真的是一件非常难的事情&#xff0c;因为在短短的半小时到一个小时&#xff0c;来判断一个同学行不行&#xff0c;其实是很不全面的。作为一个求职的同学应该怎么办呢&#xff1f;求职的同学可以提前做一些准备&#xff0c;其中比较重要的要数简历的编写。 简历的作用 简…

深入解析大数据体系中的ETL工作原理及常见组件

** 引言 关联阅读博客文章&#xff1a;探讨在大数据体系中API的通信机制与工作原理 关联阅读博客文章&#xff1a;深入理解HDFS工作原理&#xff1a;大数据存储和容错性机制解析 ** 在当今数字化时代&#xff0c;大数据处理已经成为了企业成功的重要组成部分。而在大数据处…

OpenHarmony实战:小型系统 STM32MP1 芯片移植案例

本文章基于意法半导体 STM32MP157 芯片的小熊派 BearPi-HM Micro 开发板&#xff0c;进行小型带屏开发板的移植&#xff0c;实现了 ace_engine_lite、arkui_ui_lite、aafwk_lite、appexecfwk_lite、HDF 等部件基于 OpenHarmony LiteOS-A 内核的适配。移植架构上采用 Board 与 S…

shopee虾皮怎么分析竞品?这些技巧能帮你提升出单量90%+

“竞品分析”长久以来都是运营所纠结的核心问题&#xff0c;没有分析出对标竞品怎么增长销量&#xff0c;却被其他竞品给町上了&#xff0c;导致自身销量不增反减。这种情况我们是无法直观从自身的店铺及商品本身去找到原因的&#xff0c;本质的问题在竞品身上。我们无法控制有…

基于RDMA的云服务能力实践与探索

01 背景 随着基于大数据大模型构建的数据系统越来越有商业价值&#xff0c;机器学习的玩家也越来越多&#xff0c;数据量越来越大。为解决海量数据在服务器之间的同步效率问题&#xff0c;RDMA(Remote Direct Memory Access) 技术逐渐走进了网络技术人员的视野。RDMA为什么…

鸿鹄工程项目管理系统源码:Spring Boot带来的快速开发与部署体验

随着企业规模的不断扩大和业务的快速发展&#xff0c;传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

处理关于 React lazy 白屏的两种方案

这篇文章是今天在阅读 React 官方文档的时候看到的一个关于 处理 lazy 体验问题的小技巧&#xff0c;在这里记录一下 当我们使用 React.lazy 去懒加载一个路由组件&#xff0c;在不做任何其他处理的情况下从其他页面首次进入到这个懒加载的路由页面时&#xff0c;肯定会出现白屏…

蓝桥杯单片机速成6-DS1302

目录 一、电路图 二、底层驱动 三、实际应用 四、时序 一、电路图 上图是寄存器地址定义&#xff0c;时分秒&#xff0c;年月日等等 DS1302有自己的时钟线SCLK&#xff0c;不会跟单总线一样因为没有自己的时钟线而导致温度读不出来 CH&#xff1a;时钟静止&#xff0c;置1时…

2024最新软件测试【测试理论+ 抓包与网络协议】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …