天天看點

c++ 多态學習

單純的學習記錄 QAQ

虛析構和純虛析構

1.解決父類指針釋放(開辟到堆區的)子類對象

2.需要具體的函數實作、

虛析構:
virtual ~類名()
{
   (可為空)
}
--------------------------------------------------------
純虛析構
virtu ~類名()=0;
(類外)
類名::~ 類名() 
{
   (可為空)
}
           

1.簡易電腦

#include <iostream>

using namespace std;
class calculate
{
public:
    virtual int result()=0;      //純虛函數文法:virtual 傳回值類型 函數名 (參數清單)= 0 ;
    int num1;
    int num2;
};
class add:public calculate       // “+” 功能
{
public:
    int result()               //子類必須重寫父類虛函數
    {
        return num1+num2;
    }
};
class mins:public calculate   //“-” 功能
{
public:
    int result()
    {
        return num1-num2;
    }
};
void yinyong(calculate &calculate)
{
    cout<<calculate.result()<<endl;
}
int main()
{
    calculate *p=new add;       //父類指針或引用指向子類對象
    p->num1=10;
    p->num2=20;
    cout<<p->result()<<endl;
    delete p;                 //堆區需要手動釋放

    mins m;
    m.num1=100;
    m.num2=200;
    yinyong(m);              //父類引用指向子類對象

    return 0;
}
           

2.制作飲品

#include <iostream>

using namespace std;
class drinks
{
public:
    virtual void boilwater()=0;  //純虛函數
    virtual void brew()=0;       //抽象類無法執行個體化對象
    virtual void pour()=0;       //類中隻要有一個抽象函數就成為抽象類
    virtual void relish()=0;
    void show()
    {
        boilwater();
        brew();
        pour();
        relish();
    }
};
class coffee:public drinks
{
public:
    void boilwater()
    {
        cout<<"煮水"<<endl;          //重寫父類純虛函數
    }
    void brew()
    {
        cout<<"沖泡咖啡"<<endl;
    }
    void pour()
    {
        cout<<"倒入杯中"<<endl;
    }
    void relish()
    {
        cout<<"加入糖和牛奶"<<endl;
    }
};
class tea:public drinks
{
public:
    void boilwater()
    {
        cout<<"煮水煎茶"<<endl;
    }
    void brew()
    {
        cout<<"沖泡茶葉"<<endl;
    }
    void pour()
    {
        cout<<"倒入茶壺"<<endl;
    }
    void relish()
    {
        cout<<"加入檸檬"<<endl;
    }
};
void dowork(drinks *p) //虛基類的指針,指向子類對象
{
    p->show();
    delete p;
}
int main()
{
    coffee c;
    c.show();
    cout<<"----------------------------------------------"<<endl;
    dowork(new tea);
    delete new tea;    //建立到堆區的tea 手動釋放
    return 0;
}
           

3.組裝電腦

1.設定父類純虛函數。(CPU,顯示卡,記憶體條)

2.不同公司要繼承零件,

3.組裝電腦。由于零件可能來自不同的公司,需要用指針進行控制,也就是用三個。

(用new開辟小堆區,類也能作為參數。指針可以指向用new開辟的類)

#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 Intel_CPU:public CPU
{
public:
     void calculate()
    {
        cout<<"Intel的CPU開始工作了"<<endl;
    }
};
class Intel_videocard:public videocard
{
public:
     void display()
    {
        cout<<"Intel的顯示卡開始工作了"<<endl;
    }
};
class Intel_memory:public memory
{
public:
     void storage()
    {
        cout<<"Intel的記憶體條開始工作了"<<endl;
    }
};
//**********************************************************************
class Lenovo_CPU:public CPU
{
public:
     void calculate()
    {
        cout<<"Lenovo的CPU開始工作了"<<endl;
    }
};
class Lenovo_vidercard:public videocard
{
public:
     void display()
    {
        cout<<"Lenovo的顯示卡開始工作了"<<endl;
    }
};
class Lenovo_memory:public memory
{
public:
     void storage()
    {
        cout<<"Lenovo的記憶體條開始工作了"<<endl;
    }
};
//***********************************************************************
class computer
{
    CPU *m1;
    videocard *m2;
    memory *m3;
public:
    computer(CPU *m4,videocard *m5,memory *m6)
    {
        m1=m4;m2=m5;m3=m6;
    }
    void work()
    {
        m1->calculate();
        m2->display();
        m3->storage();
    }
    ~computer()
    {
        if(m1!=NULL)
        {
            delete m1;
        }
        if(m2!=NULL)
        {
            delete m2;
        }
        if(m3!=NULL)
        {
            delete m3;
        }
    }
};

int main()
{
//第一台電腦零件
    CPU *m1=new Intel_CPU;
    videocard *m2=new Intel_videocard;
    memory *m3=new Intel_memory;
    cout<<"第一台電腦開始工作: "<<endl;
    computer *c1=new computer(m1,m2,m3);
    c1->work();
    delete c1;
    cout<<endl<<"----------------------------------------"<<endl;
    cout<<"第二台電腦開始工作:"<<endl;
    computer *c2=new computer(new Lenovo_CPU,new Lenovo_vidercard,new Lenovo_memory);
    c2->work();
    delete c2;
    cout<<endl<<"----------------------------------------"<<endl;
    cout<<"第三台電腦開始工作:"<<endl;
    computer *c3=new computer(new Intel_CPU,new Lenovo_vidercard,new Intel_memory);
    c3->work();
    delete c3;
}

           

輸出:

第一台電腦開始工作:
Intel的CPU開始工作了
Intel的顯示卡開始工作了
Intel的記憶體條開始工作了

----------------------------------------
第二台電腦開始工作:
Lenovo的CPU開始工作了
Lenovo的顯示卡開始工作了
Lenovo的記憶體條開始工作了

----------------------------------------
第三台電腦開始工作:
Intel的CPU開始工作了
Lenovo的顯示卡開始工作了
Intel的記憶體條開始工作了

Process returned 0 (0x0)   execution time : 0.047 s
Press any key to continue.

           

繼續閱讀