編譯期多型和執行期多型

2021-07-31 11:37:13 字數 1636 閱讀 8660

所謂的多型是通過乙個單一的識別符號支援不同的特定行為的能力。

靜態多型 (編譯期多型)

動態多型 (執行期多型)

虛函式過載

模板 轉換 (型別別名)

今天我們就只討論從繫結時間來分的多型種類,即編譯期多型和執行期多型。

執行期多型可以說只要學了c++的人都是知道的。因為執行期多型就是我通俗所說的多型,它的提出可以歸結於類繼承的思想的提出。對於相關功能的物件的集合,我們希望抽象出它們功能集合,在基類中宣告為虛函式,然後再子類中去重寫這些虛函式,以實現子類其特有的功能。

#include

using

namespace

std;

class animal ;

class dog :public animal

};class cat :public animal

};int main()

執行程式輸出:

dog

cat

所以,從上面這個程式我們也看出了多型的在執行期的實現方式。而其大體的原理就是在執行過程中,我們可以確定每個animal物件記憶體中存放虛函式表的內容,從而可以呼叫正確的函式。而具體實現可以去查詢虛函式的實現原理。

編譯期多型的主要是有兩種:函式過載和模板。下面我們一一來介紹一番。

所謂的函式過載,就是具有相同的函式名但是有不同引數列表(引數列表包括引數的型別、引數的個數和引數的順序,只要有乙個不同就叫做引數列表不同)的函式,我們叫他們為函式過載。函式過載可以在編譯時候就確定我們應該呼叫哪個函式,所謂我們稱之為編譯期的多型。

模板是c++泛型程式設計的一大利器,真是因為有它的存在,我們才可以很好的編寫出大量的泛型程式。例如容器等。下面我們給出模板的多型的例子:

#include

using

namespace

std;

class dog

};class cat

};template

void call(t & t)

int main()

執行程式輸出:

dog

cat

從上述的程式,我們定義了模板函式在編譯期就已經確定了t的資料型別,所以我們就可以正確的呼叫恰當的函式。

這篇部落格,只是簡單了介紹了編譯期多型和執行期多型的知識,而我們除了需要知道這些只是外,我們還需要明白這兩種實現機制所帶來的效率問題。具體的**可以參考如下部落格:

- c++的動態多型和靜態多型

- c++編譯期多型與執行期多型

最後,我再強調兩個知識點:

- 函式過載:返回值和函式名相同。引數型別和引數個數可以不同

- 函式重寫:是在子類中對父類函式進行重新定義的過程。但是需要注意下面幾個要點:

1. 被重寫的函式不能是static的。必須是virtual的,或者是override的(即函式在最原始的基類中被宣告為virtual,c++中沒有override)。

2. 重寫函式必須有相同的型別,名稱和引數列表

3. 重寫函式的訪問修飾符可以不同。儘管virtual是private的,派生類中重寫改寫為public,protected也是可以的(這點與c#完全不同)

編譯期多型和執行期多型

執行期多型 runtime polymorphism 也稱為顯式多型,是指類中成員函式是virtual,類將對這些函式表現出執行期多型,也就是說將於執行期根據基類指標或者引用的動態型別決定究竟呼叫哪乙個函式。編譯期多型 cmpile time polymorphisms 也稱為隱式多型,是指以不同的...

C 的執行期多型和編譯期多型

今日的c 不再是個單純的 帶類的c 語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c 發展中最為出彩的那部分。在物件導向c 程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式設計中,多型基於template 模板 的具現化與...

C 編譯期多型與執行期多型

閱讀目錄 關於顯式介面與隱式介面 正文 回到頂部 今日的c 不再是個單純的 帶類的c 語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c 發展中最為出彩的那部分。在物件導向c 程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式...