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

news/2024/4/30 4:16:58

一.代码展示

#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.cpky.cn/p/11779.html

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

相关文章

【stm32】I2C通信协议

【stm32】I2C通信协议 概念及原理 如果我们想要读写寄存器来控制硬件电路&#xff0c;就至少需要定义两个字节数据 一个字节是我们要读写哪个寄存器&#xff0c;也就是指定寄存器的地址 另一个字节就是这个地址下存储寄存器的内容 写入内容就是控制电路&#xff0c;读出内容就…

ChatGPT 初学者指南

原文&#xff1a;ChatGPT for Beginners 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 介绍 如果您一直关注新闻和趋势&#xff0c;您可能已经在某个地方读到或听到过&#xff0c;Sam Altman 的生成式人工智能平台 ChatGPT 已经将人工智能推向了一个新的高度 - 许多…

Topaz Video AI for Mac v5.0.0激活版 视频画质增强软件

Topaz Video AI for Mac是一款功能强大的视频处理软件&#xff0c;专为Mac用户设计&#xff0c;旨在通过人工智能技术为视频编辑和增强提供卓越的功能。这款软件利用先进的算法和深度学习技术&#xff0c;能够自动识别和分析视频中的各个元素&#xff0c;并进行智能修复和增强&…

基于springboot实现影城管理系统项目【项目源码+论文说明】

基于springboot实现影城管理系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多生活之中&#xff0c;随之就产生了“小徐影城管理系统”&#xff0c;这样就让小徐影城管理系统更加方便简单。 对于本小…

FreeRTOS学习 -- 再识

工作中一直使用FreeRTOS进行着开发&#xff0c;但是没有进行过系统的总结过。现在将快速使用几天时间将FreeRTOS相关知识点加以总结。 官网&#xff1a; https://www.freertos.org/zh-cn-cmn-s/ 参看资料&#xff1a; 正点原子 STM32F1 FreeRTOS开发手册_V1.2.pdf The FreeRTOS…

linuxday05

1、makedile原理&#xff08;增量编译生成代码&#xff09; # &#xff08;注释符&#xff09; 目标------依赖 目标不存在//目标比依赖旧才会执行命令&#xff1b; makefile的实现 1、命名要求&#xff08;Makefile/makefile&#xff09; 2、规则的集合 目标文件&#…