C 中的多型

2021-08-08 17:00:18 字數 1854 閱讀 6470

在學習c++的時候,我們知道c++有三個重要的特性:封裝,繼承,多型

那麼,我們來看一下c++是怎麼實現多型,以及多型實現的物件模型。

所謂多型,其實就是「多種形態」。

c++中虛函式的主要作用就是實現多型。簡單說父類的指標/引用呼叫重寫的虛函式,當父類指標/引用指向父類物件時呼叫的是父類的虛函式,指向子類物件時呼叫的是子類的虛函式。

1.父類的指標或者引用呼叫重寫的虛函式。

class base

void f2()

};class devir:public base

virtual

void f2()

};

在base類中,f1()為虛函式,devir類共有繼承base類,devir類中的f1()進行了重寫,而f2()不滿足重寫。這時我們拿父類的指標/引用指向devir的物件。

int main()

最終的結果如下

2.記憶體布局,通過對虛表位址的訪問,找到虛函式的位址。

每乙個虛函式表都存放著指向虛函式的指標,我們通過訪問虛函式表的指標,找到虛函式所在的空間,對空間中的虛函式一一訪問。

3.靜態的多型和動態的多型。

多型就是多種形態,c++的多型分為靜態多型和動態多型。

1.靜態多型就是過載,因為是在編譯期決議確定,所以稱為靜態多型。

2.動態多型就是通過繼承重寫基類的虛函式實現的多型,因為是在執行時決議確定,所以稱為動態多型。

動態的多型實現需要條件:

1>存在繼承。

2>父類的引用或指標指向子類的物件。

3>存在重寫。

class a

virtual

void f2()

void print()

void print(int i)

private:

int a;

};class b :public a

};void test(a& aa)

int main()

通過對f2()、print()、print(int i)的呼叫,我們通過反彙編的方式得到呼叫過程。

我們發現,在實現動態的多型時,執行時到虛函式表尋找呼叫函式的位址,而靜態多型編譯時確定了函式的位址。

C 中的多型

封裝 繼承 多型,物件導向的三大特性,前兩項理解相對容易,但要理解多型,特別是深入的了解,對於初學者而言可能就會有一定困難了。我一直認為學習oo的最好方法就是結合實踐,封裝 繼承在實際工作中的應用隨處可見,但多型呢?也許未必,可能不經意間用到也不會把它跟 多型 這個詞對應起來。在此拋磚引玉,大家討論...

C 中的多型

c 中的多型分為靜多型和動多型 也就是靜態繫結和動態繫結兩種現象 靜動的區別主要在於這種繫結發生在編譯期還是執行期,發生在編譯期的是靜態繫結,也就是靜多型 發生在執行期的則是動態繫結,也就是動多型。一 靜多型可以通過模板和函式過載來實現,下面舉兩個例子 1 函式模板 template t max c...

C 中的多型

定義 同樣的訊息被不同型別的物件接收時產生不同的行為。原理 1.編譯時多型 靜態繫結 2.執行時多型 動態繫結 分類 1.過載 包括函式過載,運算子過載 靜態繫結 2.覆蓋 包括子類和父類間虛函式 虛析構函式和純虛函式 動態繫結 要求 1.函式名相同 2.引數不同 栗子 include using ...