C++多态案例:组装电脑

本文通过一个C++编程实例展示了如何使用多态组装电脑,包括CPU、显卡和内存等部件的抽象类和具体实现。在析构函数中释放内存,确保程序资源的有效管理。此外,还解释了new运算符的作用以及对象的动态创建方式。
摘要由CSDN通过智能技术生成
#include<iostream>
using namespace std;

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();
	}
	//提供析构函数释放三个零件
	~computer() {
		if (m_cpu != NULL) {
			delete m_cpu;
			m_cpu = NULL;
		}
		if (m_mem != NULL) {
			delete m_mem;
			m_mem = NULL;
		}
		if (m_vc != NULL) {
			delete m_vc;
			m_vc = 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 {
	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 {
	virtual void storage() {
		cout << "lenovo的内存条开始存储" << endl;
	}
};
void test01() {
	CPU* cpu = new intelCPU;
	VideoCard* vc = new intelVideoCard;
	Memory* mem = new intelMemory;
	//创建第一台电脑
	computer* com1 = new computer(cpu, vc, mem);
	com1->work();
	delete com1;
	cout << "........................................" << endl;
	//组装第二台点电脑
	computer* com2 = new computer(new lenovoCPU, new lenovoVideoCard, new lenovoMemory);
	com2->work();
	delete com2;
}
int main() {
	test01();

	return 0;
}

运用多态完成组装电脑的案例。

1.释放内存

	//创建第一台电脑
	computer* com1 = new computer(cpu, vc, mem);
	com1->work();
	delete com1;

这一步释放com1这个对象,但是它里面的零件还没有释放,所以有:

	//提供析构函数释放三个零件
	~computer() {
		if (m_cpu != NULL) {
			delete m_cpu;
			m_cpu = NULL;
		}
		if (m_mem != NULL) {
			delete m_mem;
			m_mem = NULL;
		}
		if (m_vc != NULL) {
			delete m_vc;
			m_vc = NULL;
		}
	}

进一步释放零件。

内存的四种分区
  栈区(stack):编译器自动分配和释放的,主要存储的是函数的参数值,局部变量等值。发生函数调用时就为函数运行时用到的数据分配内存,函数调用结束后就将之前分配的内存全部销毁。所以局部变量、参数只在当前函数中有效,不能传递到函数外部。栈内存的大小和编译器有关,编译器会为栈内存指定一个最大值,在 VC/VS 下,默认是 1M。
  堆区(heap):动态分配。一般由程序员分配和释放(动态内存申请malloc与释放free),需要手动free。否则会一直存在,若程序员不释放,程序结束时可能由操作系统回收。
  全局区(静态区)(static):静态分配。全局变量和静态变量的存储是放在一块的,该区域在程序结束后由操作系统释放。
  代码区:通常用来存放程序执行代码(包含类成员函数和全局函数及其他函数代码),这部分区域的大小在程序运行前就已经确定,也有可能包含一些只读的常数变量,例如字符串变量。

new的作用
  在实际的编程中,实际要处理的数据数量在编程时无法确定,所需的内存空间大小无法确定时,除了定义“尽可能大的空间”的方法,还有就是动态内存分配。此种内存分配是在程序运行中进行的,而不是在编译时就确定的,因此称为“动态内存分配”。

  在 C++ 中,通过 new 运算符来实现动态内存分配。
  new开辟的空间在上。
  当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。
  new的使用格式,new出来的是一段空间的首地址。所以一般需要用指针来存放这段地址。

2.创建对象

创建对象写法1:new一个对象,父类指针指向子类对象

	CPU* cpu = new intelCPU;
	VideoCard* vc = new intelVideoCard;
	Memory* mem = new intelMemory;
	//创建第一台电脑
	computer* com1 = new computer(cpu, vc, mem);

创建对象写法2:

computer* com2 = new computer(new lenovoCPU, new lenovoVideoCard, new lenovoMemory);

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值