虚析构+电脑组装例 (野指针)

 解释图:

 ①抽象出每个零件的类 【需要加public】犯错

class CPU {
public:
	virtual void calculate() = 0;
};

class VideoCard {
public:
	virtual void display() = 0;
};

class Memory {
public:
	virtual void storage() = 0;
};

②组装电脑进行工作

//电脑类
class Computer {
	//构造函数中传入三个零件指针

	
	
	//提供工作的函数-调用每个零件工作的接口
};

③具体零件厂商

class Inter :public CPU {
	virtual void calculate() {
		cout << "Inter的CPU开始计算了!" << endl;
	}
};
class Inter :public VideoCard {
	virtual void calculate() {
		cout << "Inter的VideoCard开始运行了!" << endl;
	}
};
class Inter :public Memory {
	virtual void calculate() {
		cout << "Inter的Memory开始读取了!" << endl;
	}
};

//Lenovo零件厂商
class Lenovo :public CPU {
	virtual void calculate() {
		cout << "Inter的CPU开始计算了!" << endl;
	}
};
class Lenovo :public VideoCard {
	virtual void calculate() {
		cout << "Inter的VideoCard开始运行了!" << endl;
	}
};
class Lenovo :public Memory {
	virtual void calculate() {
		cout << "Inter的Memory开始读取了!" << endl;
	}
};

④测试阶段-组装三台不同的电脑

void test01() {
	CPU* c1 = new InterCPU;
	VideoCard* vc1 = new LenovoVidoeCard;
	Memory* m1 = new LenovoMemory();//加不加()都可以,主要是*

	Computer* com01 = new Computer(c1, vc1, m1); //传入指针的格式需要加*
	com01->work();
	delete com01;
}

完整代码:

#include <iostream>
using namespace std;
#include <string>


class CPU {
public: //需要加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();
	}

private: //声明private
	CPU* m_cpu;
	VideoCard* m_vc;
	Memory* m_mem;
};




//Inter零件厂商
class InterCPU :public CPU {
public:
	virtual void calculate() {
		cout << "Inter的CPU开始计算了!" << endl;
	}
};
class InterVidoeCard :public VideoCard {
public:
	virtual void display() {
		cout << "Inter的显卡开始显示了!" << endl;
	}
};
class InterMemory :public Memory {
public:
	virtual void storage() {
		cout << "Inter的内存条开始存储了!" << endl;
	}
};

//Lenovo零件厂商
class LenovoCPU :public CPU {
public:
	virtual void calculate() {
		cout << "Lenovo的CPU开始计算了!" << endl;
	}
};
class LenovoVidoeCard :public VideoCard {
public:
	virtual void display() {
		cout << "Lenovo的VideoCard开始运行了!" << endl;
	}
};
class LenovoMemory :public Memory {
public:
	virtual void storage() {
		cout << "Lenovo的Memory开始读取了!" << endl;
	}
};




//组装三台不同的电脑
void test01() {
	CPU* c1 = new InterCPU;
	VideoCard* vc1 = new LenovoVidoeCard;
	Memory* m1 = new LenovoMemory();

	Computer* com01 = new Computer(c1, vc1, m1); //传入指针的格式需要加*
	com01->work();
	delete com01;
}

int main() {
	test01();
}

运行结果:

 但是,零件是在堆区创建的。com01被delete释放了,但是零件还没有释放,所以在class Computer中加上:

//提供析构函数 释放3个电脑零件
	~Computer() {
		//释放CPU零件
		if (m_cpu != NULL) {
			delete m_cpu;
			m_cpu = NULL;//一定大写NULL
		}

		//释放VC零件
		if (m_vc != NULL) {
			delete m_vc;
			m_vc = NULL;//一定大写NULL
		}

		//释放Memory零件
		if (m_mem != NULL) {
			delete m_mem;
			m_mem = NULL;//一定大写NULL
		}

	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值