c 中的多型

2021-09-26 05:57:42 字數 950 閱讀 2166

多型,顧名思義,就是多種形態。總的來說就是一句話:使基類指標或引用可以訪問子類物件。

介紹多型前,先說函式呼叫**。

把函式體與函式呼叫相聯絡稱為**(binding)。當**在程式執行之前(由編譯器和聯結器)完成時,這個叫早**(early bingding)。在c語言中,**的方式只有一種——早**。而在執行時發生的**,叫做動態**(dynamic binding)或者執行時**(runtime binding)。在c++中,通過在基類中宣告函式時使用virtual關鍵字,告訴編譯器使用晚**。晚**只對virtual函式起作用,而且只在使用含有virtual函式的基類的位址時發生。

為了實現多型,編譯器對每個包含虛函式的類建立乙個vtab(虛函式表)和乙個vptr(指標),並在建構函式中初始化vptr指向vtab,並把宣告的虛函式的位址放到vtab中。一般這個vtab的位址是在類物件位址的最前面,所以現在這個時候,this指標和vptr指標指向的位址應該一致——指向這個類物件的首位址。

當子類繼承這個基類時,子類也會繼承這個vptr,而子類的vptr也指向自己的這個vptr,其vptr的位置與基類中vptr的位置一樣——在物件的最前面,此時不論在子類中該函式是否有virtual關鍵字,這個函式都是虛函式。如果在子類中又增加了virtul函式,則編譯器會在從基類繼承的、子類自己的vtab最下面插入這個新的virtual函式的位址。

因為是晚繫結,所以函式在編譯的過程中,不會繫結其呼叫位址。在程式執行中,呼叫virtual的時候,如果是通過基類指標或者引用呼叫虛函式時,如果該基類指標或引用指向的是子類物件,則會查詢基類指標指向的子類的vtab,從而取得正確的函式位址,然後呼叫該函式,這就實現了多型。

下面看**:

#include using namespace std;

class base

{public:

virtual void show(){cout<<"base show"《此時列印的是b show。

C 中的多型

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

C 中的多型

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

C 中的多型

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