多型(Polymorphism)

重載(overload)可以使同一個函式名稱,在父類別和子類別上有不同的實作,至於要呼叫哪個函式在編譯時期就能決定,這類型稱為靜態繫結(Static binding),另外一類為動態繫結(Dynamic binding),必須在執行時期才得知實際呼叫哪個函式,多型可讓我們做到動態繫結。

一個基底類別的物件指標,可以用來指向其衍生類別物件而不會發生錯誤,假如基底類別是Father,衍生類別是Son,則下面這個指定是可以接受的,也因為這個原因,當我們使用父類別的指標或參考當作函式的參數,實際呼叫函式時,可以傳入指向父類別或子類別的指標。
Son son;
Father *fptr = &son;

只有在使用指標或參考時才得以發揮多型的特性,由於fptr仍是Father類別的指標,所以只能操作Father中的成員變數和成員函式,將衍生類別的指標指向基底類別基本上是不可行的,可以使用型態轉換的方式來達成,但通常不這樣處理。

除了使用指標或參考,需要在基底類別把要多型的函式前加上關鍵字virtual,表示這函式是虛擬函式,並在衍生類別中重新定義虛擬函式,表示此成員函式的操作延遲至執行時期再決定,下面程式碼是個簡單的示範。

#include <iostream> 
using namespace std; 

class Father{ 
public: 
    virtual void show() { 
        cout << "it's Father" << endl; 
    } 
}; 

class Son : public Father{ 
public: 
    virtual void show() { 
        cout << "it's Son" << endl; 
    } 
}; 

void showByPtr(Father *father) {
    father->show();
}

void showByRef(Father &father) {
    father.show();
}

int main() { 
    Father father; 
    Son son; 

    showByPtr(&father); 
    showByPtr(&son);
    showByRef(father); 
    showByRef(son);

    system("PAUSE");
    return 0;
}