案例需求
![img](https://typora-kevin.oss-cn-qingdao.aliyuncs.com/20220218112947.png)
一个电脑分为三个部分。每个部分都有两个厂商,因特尔和联想。
使得可以调用一个新电脑的三个部分的功能。
#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;
}