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

2021-09-02 05:47:09 字數 1709 閱讀 3220

閱讀目錄

關於顯式介面與隱式介面

正文

回到頂部

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

什麼是執行期多型

什麼是編譯期多型

它們的優缺點在哪

回到頂部

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

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

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

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

intmain

()//delete物件

//...

return

0;

總結:執行期多型通過虛函式發生於執行期回到頂部

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

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

class

animal;};

class

dog};

class

cat};

class

bird

};template

void

animalshout

(t & t)

intmain

()

我們稱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三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式設計中,多型基於template 模板 的具現化與...