C/C++—— 對多型現象的理解

readyao發表於2016-04-04

多型問題彙總:
C/C++—— C++編譯器是如何實現多型
C/C++—— 在建構函式中呼叫虛擬函式能實現多型嗎(Vptr指標初始化的過程分析)
C/C++—— C++中建構函式不能是虛擬函式的原因分析
C/C++—— C++中定義虛解構函式的原因

C++的三大特性:封裝,繼承和多型。

多型特性分析主要有幾個方面:多型的表現形式,多型實現的條件,多型如何實現,多型的理論基礎。

多型的實現效果

同樣的呼叫語句有多種不同的表現形態;

見下面例子,在下面例子中函式void printObj(Parent * pbase);函式可以通過一個基類指標呼叫子類的函式。

#include <iostream>
using namespace std;

class Parent{
    public:
        Parent(int a = 0){
            this->a = a;
        }
        virtual void print()
        {
            cout << "Parent, a = " << a << endl;
        }
    private:
        int a;
};

class Child:public Parent{
    public:
        Child(int b = 0){
            this->b = b;
        }
        //void print()
        virtual void print()//這裡的virtual關鍵字可以要也可以不要,一般為了表明該函式虛擬函式則加上該關鍵字virtual
        {
            cout << "Child, b = " << b << endl;
        }

    private:
        int b;
};

void printObj(Parent * pbase)
{
    pbase->print();
}

int main()
{
    Parent p(10);
    Child c(11);

    printObj(&p);
    printObj(&c);

    return 0;
}

輸出為:
Parent, a = 10
Child, b = 11

從輸出結果可以看出printObj(&c);傳入的是子類物件,但是函式的形參是父類的指標。但是確實是呼叫的是子類物件的print函式。這種現象就是多型。

多型實現的三個條件

有繼承、有virtual重寫、有父類指標(引用)指向子類物件。
這三個條件,我們可以在上面的例子中可以看到。

如果實現多型

virtual關鍵字,告訴編譯器這個函式要支援多型;不要根據指標型別判斷如何呼叫;而是要根據指標所指向的實際物件型別來判斷如何呼叫。

多型的理論基礎

動態聯編PK靜態聯編。根據實際的物件型別來判斷重寫函式的呼叫。

多型的重要意義

設計模式的基礎。

實現多型的理論基礎

函式指標做函式引數

相關文章