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

2022-01-21 21:41:25 字數 2016 閱讀 7150

今日的c++不再是個單純的「帶類的c」語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c++發展中最為出彩的那部分。在物件導向c++程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型;在泛型程式設計中,多型基於template(模板)的具現化與函式的過載解析,這種多型在編譯期進行,因此稱為編譯期多型或靜態多型。在本文中,我們將了解:

什麼是執行期多型

什麼是編譯期多型

它們的優缺點在哪

執行期多型的設計思想要歸結到類繼承體系的設計上去。對於有相關功能的物件集合,我們總希望能夠抽象出它們共有的功能集合,在基類中將這些功能宣告為虛介面(虛函式),然後由子類繼承基類去重寫這些虛介面,以實現子類特有的具體功能。典型地我們會舉下面這個例子:

執行期多型的實現依賴於虛函式機制。當某個類宣告了虛函式時,編譯器將為該類物件安插乙個虛函式表指標,並為該類設定一張唯一的虛函式表,虛函式表中存放的是該類虛函式位址。執行期間通過虛函式表指標與虛函式表去確定該類虛函式的真正實現。

執行期多型的優勢還在於它使處理異質物件集合稱為可能:

//我們有個動物園,裡面有一堆動物

int main()

//delete物件

//...

return 0;

}

總結:執行期多型通過虛函式發生於執行期對模板引數而言,多型是通過模板具現化和函式過載解析實現的。以不同的模板引數具現化導致呼叫不同的函式,這就是所謂的編譯期多型。

相比較於執行期多型,實現編譯期多型的類之間並不需要成為乙個繼承體系,它們之間可以沒有什麼關係,但約束是它們都有相同的隱式介面。我們將上面的例子改寫為:

class animal;};

class dog

int main()

在編譯之前,函式模板中t.shout()呼叫的是哪個介面並不確定。在編譯期間,編譯器推斷出模板引數,因此確定呼叫的shout是哪個具體型別的介面。不同的推斷結果呼叫不同的函式,這就是編譯器多型。這類似於過載函式在編譯器進行推導,以確定哪乙個函式被呼叫。

oo設計中重要的特性,對客觀世界直覺認識。

能夠處理同乙個繼承體系下的異質類集合。

執行期間進行虛函式繫結,提高了程式執行開銷。

龐大的類繼承層次,對介面的修改易影響類繼承層次。

由於虛函式在執行期在確定,所以編譯器無法對虛函式進行優化。

虛表指標增大了物件體積,類也多了一張虛函式表,當然,這是理所應當值得付出的資源消耗,列為缺點有點勉強。

它帶來了泛型程式設計的概念,使得c++擁有泛型程式設計與stl這樣的強大**。

在編譯器完成多型,提高執行期效率。

具有很強的適配性與松耦合性,對於特殊型別可由模板偏特化、全特化來處理。

程式可讀性降低,**除錯帶來困難。

無法實現模板的分離編譯,當工程很大時,編譯時間不可小覷。

無法處理異質物件集合。

所謂的顯式介面是指類繼承層次中定義的介面或是某個具體類提供的介面,總而言之,我們能夠在源**中找到這個介面.顯式介面以函式簽名為中心,例如

void animalshot(animal & anim)

我們稱shout為乙個顯式介面。在執行期多型中的介面皆為顯式介面。

而對模板引數而言,介面是隱式的,奠基於有效表示式。例如:

template void animalshot(t & anim)

對於anim來說,必須支援哪一種介面,要由模板引數執行於anim身上的操作來決定,在上面這個例子中,t必須支援shout()操作,那麼shout就是t的乙個隱式介面。

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

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

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

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

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

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