案例描述:
- 电脑主要组成部件为 CPU(用于计算),显卡(用于显示),内存条(用于存储)
- 将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商
- 创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口
- 测试时组装三台不同的电脑进行工作
#include"inherit_10.h"
// CPU抽象类
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* cobj, VideoCard* vobj, Memory* mobj)
{
this->_cpu = cobj;
this->_vc = vobj;
this->_mem = mobj;
}
~Computer()
{
// 释放CPU
if (this->_cpu != NULL)
{
delete this->_cpu;
this->_cpu = NULL;
}
// 释放显卡
if (this->_vc != NULL)
{
delete this->_vc;
this->_vc = NULL;
}
// 释放内存
if (this->_mem != NULL)
{
delete this->_mem;
this->_mem = NULL;
}
}
// 运行电脑
void work()
{
this->_cpu->calculate();
this->_vc->display();
this->_mem->storage();
}
CPU* _cpu; // CPU指针
VideoCard* _vc; // 显卡指针
Memory* _mem; // 内存指针
};
// 英特尔CPU
class Intel_CUP :public CPU
{
public:
virtual void calculate()
{
cout << "英特尔CPU正在计算" << endl;
}
};
// 英特尔显卡
class Intel_VC :public VideoCard
{
public:
virtual void display()
{
cout << "英特尔显卡正在显示" << endl;
}
};
// 英特尔内存条
class Intel_Mem :public Memory
{
public:
virtual void storage()
{
cout << "英特尔内存正在储存" << endl;
}
};
// 联想CPU
class Lenovo_CUP :public CPU
{
public:
virtual void calculate()
{
cout << "联想CPU正在计算" << endl;
}
};
// 联想显卡
class Lenovo_VC :public VideoCard
{
public:
virtual void display()
{
cout << "联想显卡正在显示" << endl;
}
};
// 联想内存条
class Lenovo_Mem :public Memory
{
public:
virtual void storage()
{
cout << "联想内存正在储存" << endl;
}
};
// 组装电脑
// 传入 CPU/显卡/内存 指针
void assemble_computer(CPU* _cpu, VideoCard* _vc, Memory* _mem)
{
Computer computer(_cpu, _vc, _mem);
computer.work();// 调用对象工作
cout << endl;
}
void inherit_10_pointer()
{
// lenovo computer (创建不同类型的指针对象,并传入形参)
assemble_computer(new Lenovo_CUP(), new Lenovo_VC(), new Lenovo_Mem());
// intel computer (创建不同类型的指针对象,并传入形参)
assemble_computer(new Intel_CUP(), new Intel_VC(), new Intel_Mem());
// 自定义组装(创建不同类型的指针对象,并传入形参)
assemble_computer(new Intel_CUP(), new Intel_VC(), new Lenovo_Mem());
}