电脑组装的多态案例——c++

25 篇文章 0 订阅

案例需求

img

一个电脑分为三个部分。每个部分都有两个厂商,因特尔和联想。

使得可以调用一个新电脑的三个部分的功能。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<string>

//三部分
class CPU
{
public:
	virtual void caculate() = 0;
};
class VideoCard//显卡
{
public:
	virtual void display() = 0;
};
class Memory//内存
{
public:
	virtual void storage() = 0;
};

//Intel厂商
class IntelCPU :public CPU
{
public:
	virtual void caculate()
	{
		cout << "IntelCPU执行计算工作" << endl;
	}
};

class IntelVideoCard :public VideoCard
{
public:
	virtual void display()
	{
		cout << "IntelVideoCard执行显示工作" << endl;
	}
};

class IntelMemory :public Memory
{
public:
	virtual void storage()
	{
		cout << "IntelMemory执行存储工作" << endl;
	}
};

//Leonovo厂商
class LeonovoCPU :public CPU
{
public:
	virtual void caculate()
	{
		cout << "LeonovoCPU执行计算工作" << endl;
	}
};

class LeonovoVideoCard :public VideoCard
{
public:
	virtual void display()
	{
		cout << "LeonovoVideoCard执行显示工作" << endl;
	}
};

class LeonovoMemory :public Memory
{
public:
	virtual void storage()
	{
		cout << "LeonovoMemory执行存储工作" << endl;
	}
};

//电脑类
class computer
{
public:
	computer(CPU* cpu,VideoCard* videocard,Memory* memory)
	{
		this->m_CUP = cpu;
		this->m_VideoCard = videocard;
		this->m_Memory = memory;
	}
	CPU* m_CUP;
	VideoCard* m_VideoCard;
	Memory* m_Memory;

	void Work()
	{
		m_CUP->caculate();
		m_Memory->storage();
		m_VideoCard->display();
	}
};

//测试
int main()
{

	IntelCPU* intelcpu = new IntelCPU;
	LeonovoMemory* Leonovomemory = new LeonovoMemory;
	LeonovoVideoCard* Leonovovideocard = new LeonovoVideoCard;
	//在堆上创建电脑对象
	computer* NewComputer= new computer(intelcpu, Leonovovideocard, Leonovomemory);

	//在栈上创建电脑对象
	computer c1(intelcpu, Leonovovideocard, Leonovomemory);


	NewComputer->Work();
	c1.Work();


	return 0;
}

上面的代码是有瑕疵的,创建的对象没有释放(干净)

如果在栈上创建的对象,那么编译器就会自动调用自己的析构函数,但是它自己的析构函数只能清楚电脑这个对象,无法释放这三个零件的开辟的空间,所以需要重载一下析构函数。

如果是在堆上创建的对象,那么就需要自己手动去释放这个对象。delete会自动的调用析构函数。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<string>

//三部分
class CPU
{
public:
	virtual void caculate() = 0;
};
class VideoCard//显卡
{
public:
	virtual void display() = 0;
};
class Memory//内存
{
public:
	virtual void storage() = 0;
};

//Intel厂商
class IntelCPU :public CPU
{
public:
	virtual void caculate()
	{
		cout << "IntelCPU执行计算工作" << endl;
	}
};

class IntelVideoCard :public VideoCard
{
public:
	virtual void display()
	{
		cout << "IntelVideoCard执行显示工作" << endl;
	}
};

class IntelMemory :public Memory
{
public:
	virtual void storage()
	{
		cout << "IntelMemory执行存储工作" << endl;
	}
};

//Leonovo厂商
class LeonovoCPU :public CPU
{
public:
	virtual void caculate()
	{
		cout << "LeonovoCPU执行计算工作" << endl;
	}
};

class LeonovoVideoCard :public VideoCard
{
public:
	virtual void display()
	{
		cout << "LeonovoVideoCard执行显示工作" << endl;
	}
};

class LeonovoMemory :public Memory
{
public:
	virtual void storage()
	{
		cout << "LeonovoMemory执行存储工作" << endl;
	}
};

//电脑类
class computer
{
public:
	computer(CPU* cpu,VideoCard* videocard,Memory* memory)
	{
		this->m_CPU = cpu;
		this->m_VideoCard = videocard;
		this->m_Memory = memory;
	}
	~computer()//重载析构函数
	{
		cout << "电脑的析构调用" << endl;
		if (this->m_CPU)
		{
			delete this->m_CPU;
			this->m_CPU = NULL;

		}
		if (this->m_Memory)
		{
			delete this->m_Memory;
			this->m_Memory = NULL;
		}
		if (this->m_VideoCard)
		{
			delete this->m_VideoCard; 
			this->m_VideoCard = NULL;
		}

	}

	CPU* m_CPU;
	VideoCard* m_VideoCard;
	Memory* m_Memory;

	void Work()
	{
		m_CPU->caculate();
		m_Memory->storage();
		m_VideoCard->display();
	}
	
};

//测试
int main()
{

	IntelCPU* intelcpu = new IntelCPU;
	LeonovoMemory* Leonovomemory = new LeonovoMemory;
	LeonovoVideoCard* Leonovovideocard = new LeonovoVideoCard;
	//在堆上创建电脑对象
	//computer* NewComputer= new computer(intelcpu, Leonovovideocard, Leonovomemory);

	//在栈上创建电脑对象
	computer c1(intelcpu, Leonovovideocard, Leonovomemory);


	//NewComputer->Work();
	c1.Work();


	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小明同学啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值