编辑代码

/*本文档先进行 电脑组装 (多态)案例的 尝试书写
电脑主要组成:CPU(计算)、显卡(显示)、内存条(存储)
创建 电脑类(让电脑工作的函数),调用每个零件工作的接口*/
#include <iostream>
using namespace std;
//抽象出每个零件的类:
//CPU抽象类
class CPU{
public:
    virtual void calculate() = 0;//CPU的纯虚函数-计算(待子类重写)
};
//显卡抽象类
class VideoCard{
public:
    virtual void display() = 0;//显卡的纯虚函数-显示(待子类重写)
};
//内存抽象类
class Memory{
public:
    virtual void storage() = 0;//内存的纯虚函数-存储(待子类重写)
};
//具体厂商
//Intel-CPU
class IntelCpu:public CPU{
public:
    void calculate(){//重写计算函数
        cout<<"Intel的CPU开始计算"<<endl;
    }
};
//高通Qualcomm-CPU
class QualcommCpu:public CPU{
public:
    void calculate(){//重写计算函数
        cout<<"Qualcomm的CPU开始计算"<<endl;
    }
};
//联想Lenovo-显卡
class LenVideo:public VideoCard{
public:
    void display(){//重写显示函数
        cout<<"Lenovo的显卡开始显示"<<endl;
    }
};
//联想Lenovo-内存
class LenMem:public Memory{
public:
    void storage(){//重写存储函数
        cout<<"Lenovo的内存开始存储"<<endl;
    }
};
//电脑类
class Computer{
public:
    //构造函数中,传入三个零件指针
    Computer(CPU * pc,VideoCard * pv,Memory * pm){//构造函数
        cout<<"--Computer的构造函数在调用--"<<endl;
        m_c = pc;
        m_v = pv;
        m_m = pm;
    }
    CPU * m_c;//CPU等是抽象类,不能实例化对象,但是可以创建指向这些类型的指针
    VideoCard * m_v;
    Memory * m_m;
    //提供工作的函数
    void Work()
    {
        //调用每个零件工作的接口
        m_c->calculate();
        m_v->display();
        m_m->storage();
    }
    ~Computer(){//析构函数,将使用过的指针释放掉(堆区利用)
        cout<<"--Computer的析构函数在调用--"<<endl;
        if(m_c!=NULL||m_v!=NULL||m_m!=NULL){
            delete m_c;
            delete m_v;
            delete m_m;
            m_c = NULL;
            m_v = NULL;
            m_m = NULL;
        }
    }

};
void test(){
    cout<<"第一台电脑:"<<endl;
    Computer computer1(new IntelCpu,new LenVideo, new LenMem);
    computer1.Work();
    cout<<"第二台电脑:"<<endl;
    Computer computer2(new QualcommCpu,new LenVideo, new LenMem);
    computer2.Work();

}
int main(){
    test();
}