首頁 > 軟體

C++多型的範例詳解

2022-06-28 18:04:33

今天就以三個案例來把C++多型的內容結束。第一個案例就是用多型寫一個計算器並實現簡單的加減乘除操作;第二個案例就是一個飲品製作,主要就是抽象類重寫方法;第三個是比較綜合的電腦組裝案例,正文會詳細介紹;那麼就開始上手操作吧!

案例一:計算器

案例要求

使用多型實現計算器的加減乘除操作

程式碼實現

class AbstractCalculator
{
public:
    //純虛擬函式,用來得到計算結果
    virtual void getResult() = 0;
    float num1, num2;
};
//加法類
class Add :public AbstractCalculator
{
public:
    void getResult()
    {
        cout << num1 << "+" << num2 << "=" << num1 + num2 << endl;
    }
};
//減法類
class Sub :public AbstractCalculator
{
public:
    void getResult()
    {
        cout << num1 << "-" << num2 << "=" << num1 - num2 << endl;
    }
};
//乘法類
class Mul :public AbstractCalculator
{
public:
    void getResult()
    {
        cout << num1 << "*" << num2 << "=" << num1 * num2 << endl;
    }
};
//除法類
class Des :public AbstractCalculator
{
public:
    void getResult()
    {
        cout << num1 << "/" << num2 << "=" << num1 / num2 << endl;
    }
};
void main()
{
    //1、加法
    AbstractCalculator *abc = new Add();
    abc->num1 = 2.1;
    abc->num2 = 3.9;
    abc->getResult();
    delete abc;
    //2、減法
    abc = new Sub();
    abc->num1 = 3.9;
    abc->num2 = 2.1;
    abc->getResult();
    delete abc;
    //3、乘法
    abc = new Mul();
    abc->num1 = 4.2;
    abc->num2 = 2;
    abc->getResult();
    delete abc;
    //4、除法
    abc = new Des();
    abc->num1 = 8.8;
    abc->num2 = 2;
    abc->getResult();
    delete abc;
}

程式碼解釋 

首先建立AbstractCalculator類作為基礎類別,設定兩個浮點型屬性用來做基本運算,並含有純虛擬函式getResult。我們知道還有純虛擬函式的類被稱為抽象類,特點是無法範例化,非抽象子類必須重寫抽象類的所有純虛擬函式,因此基本運算的類都要重寫getResult方法。接下來寫了加減乘除四個派生類繼承該抽象類,分別給派生類的getResult進行重寫,得到不同的計算結果。主函數中利用父類別指標來建立子類物件,給兩個運算元賦值後呼叫getResult方法,然後利用delete刪除指標。注意刪除指標只是刪除了那一塊地址,該指標的型別是不變的,還可以多次利用,指向不同的子類物件。

執行效果

案例二:製作飲品

案例要求

給出製作飲品的過程為四步:把水煮開、沖泡、倒入杯中、加入佐料。

利用多型寫出兩個飲品的製作過程

程式碼實現

#include<iostream>
using namespace std;
//使用多型製作奶茶
class AbstractDrink
{
public:
    //製作開水
    virtual void boiledWater() = 0;
    //沖泡
    virtual void brew() = 0;
    //倒入杯中
    virtual void inCup() = 0;
    //加入佐料
    virtual void pour() = 0;
    void makeDrink()
    {
        this->boiledWater();
        this->brew();
        this->inCup();
        this->pour();
    }
};
//製作咖啡
class Coffee :public AbstractDrink
{
public:
    //煮水
    virtual void boiledWater()
    {
        cout << "先把水煮開" << endl;
    }
    //沖泡 
    virtual void brew()
    {
        cout << "開始沖泡咖啡" << endl;
    }
    //倒入杯中
    virtual void inCup()
    {
        cout << "全部倒入杯中" << endl;
    }
    //加入輔料
    virtual void pour()
    {
        cout << "加入糖和牛奶" << endl;
        cout << "牛奶咖啡製作完成" << endl;
    }
};
//製作茶水
class Tea :public AbstractDrink
{
public:
    //煮水
    virtual void boiledWater()
    {
        cout << "先把水煮開" << endl;
    }
    //沖泡 
    virtual void brew()
    {
        cout << "開始沖泡茶葉" << endl;
    }
    //倒入杯中
    virtual void inCup()
    {
        cout << "全部倒入杯中" << endl;
    }
    //加入輔料
    virtual void pour()
    {
        cout << "加入枸杞" << endl;
        cout << "茶水製作完成" << endl;
    }
};
//製作函數
void DoWork(AbstractDrink* abs)//父類別指標指向子類物件AbstractDrinking* abs = new Coffee;
{
    abs->makeDrink();
    delete abs;//手動釋放
    //堆區的資料被銷燬了但是指標的型別沒變,可以多次利用
}
void test()
{
    DoWork(new Coffee);
    cout << "---------------------" << endl;
    DoWork(new Tea);
}
void main()
{
    test();
}

程式碼解釋

這個案例就是直接給一個類中加四個純虛擬函式,然後再加一個makeDrink方法來呼叫全部函數。子類中需要重寫四個純虛擬函式,製作咖啡和茶的類步驟基本一樣。在DoWork函數的形參列表,使用父類別的指標,那麼在test函數呼叫DoWork函數就可以直接new子類物件,這樣也是父類別指標指向子類物件,然後呼叫makeDrink方法後,用delete刪除堆區父類別指標,以免記憶體漏失。

執行效果

案例三:電腦組裝

案例要求

電腦主要組成部件為 CPU(用於計算),顯示卡(用於顯示),記憶體條(用於儲存)

將每個零件封裝出抽象基礎類別,並且提供不同的廠商生產不同的零件,例如Intel廠商和Lenovo廠商

建立電腦類提供讓電腦工作的函數,並且呼叫每個零件工作的介面

測試時組裝三臺不同的電腦進行工作

程式碼實現

class CPU
{
public:
    virtual void calculate() = 0;
};
class VideoCard
{
public:
    virtual void display() = 0;
};
class Storage
{
public:
    virtual void storage() = 0;
};
class Computer
{
public:
    Computer(CPU* cpu, VideoCard* vc, Storage* sto)
    {
        m_cpu = cpu;
        m_vc = vc;
        m_sto = sto;
    }
    //提供一個工作的函數
    void work()
    {
        m_cpu->calculate();
        m_vc->display();
        m_sto->storage();
    }
    //提供解構函式釋放3個電腦零件
    ~Computer()
    {
        //釋放CPU零件
        if (m_cpu != NULL)
        {
            delete m_cpu;
            m_cpu = NULL;
        }
        //釋放顯示卡零件
        if (m_vc != NULL)
        {
            delete m_vc;
            m_vc = NULL;
        }
        //釋放記憶體條零件指標
        if (m_sto != NULL)
        {
            delete m_sto;
            m_sto = NULL;
        }
    }
private:
    CPU* m_cpu;//CPU零件指標
    VideoCard* m_vc;//顯示卡零件指標
    Storage* m_sto;//記憶體條零件指標
};
//Intel
class IntelCPU :public CPU
{
public:
    virtual     void calculate()
    {
        cout << "Intel的CPU開始計算了" << endl;
    }
};
class IntelVideoCard :public VideoCard
{
public:
    virtual     void display()
    {
        cout << "Intel的顯示卡開始顯示了" << endl;
    }
};
class IntelMemory :public Storage
{
public:
    virtual     void storage()
    {
        cout << "Intel的記憶體條開始儲存了" << endl;
    }
};
//Lenovo
class LenovoCPU :public CPU
{
public:
    virtual     void calculate()
    {
        cout << "Lenovo的CPU開始計算了" << endl;
    }
};
class LenovoVideoCard :public VideoCard
{
public:
    virtual     void display()
    {
        cout << "Lenovo的顯示卡開始顯示了" << endl;
    }
};
class LenovoMemory :public Storage
{
public:
    virtual     void storage()
    {
        cout << "Lenovo的記憶體條開始儲存了" << endl;
    }
};
//組裝電腦
void test01()
{
    //建立第一臺電腦
    Computer* c1 = new Computer(new IntelCPU,new IntelVideoCard, new IntelMemory);
    c1->work();
    delete c1;
    cout << "***********************" << endl;
    //組裝第二臺電腦
    Computer* c2 = new Computer(new LenovoCPU, new LenovoVideoCard, new LenovoMemory);
    c2->work();
    delete c2;
    cout << "***********************" << endl;
    //組裝第三臺電腦
    Computer* c3 = new Computer(new LenovoCPU, new IntelVideoCard, new LenovoMemory);
    c3->work();
    delete c3;
}
void main()
{
    test01();
    system("pause");
}

程式碼解釋

首先把CPU,顯示卡,記憶體條做成基礎類別並各自新增純虛擬函式,強制派生類進行重寫。

然後建立Computer類,封裝三個零件類的指標,在電腦類的有參構造中傳入三個零件的指標並賦值,提供work函數呼叫各個零件的功能函數。在程式結束之前編譯器會自動呼叫解構,所以我提供一個電腦類的解構函式,釋放掉三個零件的指標。

接下來提供兩個品牌,有Intel和Lenovo兩個品牌的三種零件。對每個品牌的三個零件類進行繼承並重寫功能函數,提示具體品牌的零件做了什麼具體的功能。

最後建立三個電腦,將零件進行組裝,可以全部都是Intel也可以都是Lenovo也可以混合著組裝。利用new開闢電腦類,直接使用有參構造,將new出來的零件類傳給對應的父類別指標,完成多型的使用。電腦類建立完畢後呼叫work函數使電腦執行,隨後就將堆區指標刪除,防止記憶體洩露。

執行效果

以上就是C++多型的範例詳解的詳細內容,更多關於C++多型的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com