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

一.代码展示

cpp 复制代码
#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构建电脑各零件类

cpp 复制代码
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创建电脑类

cpp 复制代码
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个零件的指针 去接收传入的零件指针

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

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

2.创建构造函数

cpp 复制代码
Computer(CPU* cpu, CVideoCard* vc, Memory* mem) {
	  m_cpu = cpu;
	  m_vc = vc;
	  m_mem = mem;
	}

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

3.创建工作函数

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

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

cpp 复制代码
class CPU {
public:
	//抽象计算函数
	virtual void calculate() = 0;

};

4.创建析构函数

cpp 复制代码
	//析构函数
	~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创建各品牌的零件

cpp 复制代码
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系列的零件

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

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

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

class intelCPU : public CPU

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

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

因此子类也要使用这个虚函数,并给这个虚函数重载一下,所以代码为:

virtual void calculate()

{

cout << "Intel CPU 正在计算" << endl;

}

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

2.4创建一个主机

cpp 复制代码
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.创建各品牌零件

cpp 复制代码
	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.组装一个电脑

cpp 复制代码
	Computer* c1 = new Computer(Intelcpu, Intelvc, Intelmem);
	c1->doWork();
	delete c1;

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

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

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

cpp 复制代码
delete c1;
相关推荐
John_ToDebug1 小时前
浏览器扩展延迟加载优化实战:如何让浏览器启动速度提升50%
c++·chrome·windows
是娇娇公主~1 小时前
C++ 中 std::deque 的原理?它内部是如何实现的?
开发语言·c++·stl
SuperEugene1 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
xuxie992 小时前
N11 ARM-irq
java·开发语言
wefly20173 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
luanma1509803 小时前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默3 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
csdn_aspnet4 小时前
C/C++ 两个凸多边形之间的切线(Tangents between two Convex Polygons)
c语言·c++·算法
kyriewen114 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript
娇娇yyyyyy5 小时前
QT编程(18): Qt QItemSelectionModel介绍
开发语言·qt