C 中的多型

2021-08-21 08:12:43 字數 2450 閱讀 4289

●多型就是同一事物在不同環境下的不同狀態。

靜態多型:編譯器在編譯期間來確定程式具體呼叫哪個函式

①函式過載:

②泛型程式設計

動態多型:在程式執行時來確定程式具體呼叫哪個函式

●基類中必須包含虛函式,在派生類中必須對基類的虛函式進行重寫

●必須通過基類的指標或引用呼叫虛函式

●虛函式的定義即就是在函式的定義前加上virtual關鍵字。

●查閱c++primer得知,在c++語言中,當我們使用基類的引用或指標呼叫乙個虛成員函式時會進行動態繫結。因為我們直到執行時才能知道到底使用了哪個版本的虛函式,所以所有的虛函式都必須有定義。

●當某個虛函式通過指標或引用呼叫時,編譯器產生的**直到執行時才能確定究竟要呼叫哪乙個版本的虛函式。

注意:

●只有類的非靜態成員函式才能定義為虛函式,靜態成員不能定義為虛函式。

●如果在類外定義虛函式,只在宣告時加上virtual關鍵字,定義時不用加。

●建構函式不能定義為虛函式,雖然可以將operator=(操作符的過載)定義為虛函式,但是最好不要這樣做,使用時容易混淆。

●不要在建構函式和析構函式中呼叫虛函式,在建構函式或析構函式中,物件是不完整的,可能出現未定義的行為。

●最好將基類的析構函式宣告為虛函式。

●首先將要被重寫的來自基類的函式必須為虛函式。

●對虛函式的重寫就是在派生類中,寫乙個與基類中虛函式原型完全一致(返回值相同,函式名相同,引數列表相同)的函式來覆蓋虛函式中的函式內容。

●當我們對某個來自基類的虛函式進行重寫時,可以再一次使用virtual關鍵字指出該函式的性質。但是這並不是必須的,因為一旦乙個函式被宣告為虛函式,則在所有派生類中它都是虛函式。

例外:

①協變(返回值型別不同):當乙個虛函式在基類中的返回值為基類的指標(this指標)或引用時,派生類中對該函式的重寫也應該返回派生類的指標(this指標)或引用。

②析構函式的重寫(最好將基類的析構函式宣告為虛函式):析構函式比較特殊,因為派生類的析構函式跟基類的析構函式名稱不一樣,但是仍然構成重寫,編譯器在這裡做了特殊處理。

●在成員函式(必須是虛函式)的形參列表後面寫上=0,則成員函式為純虛函式。包含純虛函式的類稱為抽象類(也叫介面類),抽象類不能例項化出物件,純虛函式在派生類中重新定義之後,派生類才能例項化出物件。

//建立乙個抽象類

class base

;int main()

進行編譯時編譯器報錯:

當你走在街上,看到乙個人,要是你想要與這位人進行交談,那麼稱呼肯定是必須的,如果這位人是男士,你就應該稱他為帥哥,如果是女士,就應該稱她為美女,如果是小孩子,那就應該稱他為小朋友,這就是乙個實際生活中多型的例子:

#include

using

namespace

std;

class yousay//定義稱呼的類模型

void isawoman()//如果是女

void isachild()//如果是小朋友

};class person//定義用來指向人的抽象類

;class man :public person//定義男士類讓它公有繼承自person類

};class woman :public person//定義女士類讓它公有繼承自person類

};class child :public person//定義小孩子類讓它公有繼承自person類

};int main()

執行結果:

可以看到,我們呼叫的始終是相同的函式,但是它的結果是不同的。

●建立物件時,在物件的前4個位元組內會存放乙個指標,這個指標指向乙個虛函式列表

●如果物件是基類物件,那麼就會將基類中虛函式的位址按照其宣告次序依次新增到虛表中,在vs2013環境下會以00 00 00 00作為虛函式列表結束的標誌。

●如果物件是派生類物件,那麼就會先將基類的虛函式表拷貝乙份,如果派生類重寫了基類的某個虛函式,就用派生類中的虛函式位址替換相同偏移量位置的基類虛函式位址,將派生類自己新新增的虛函式位址按照其宣告次序新增到虛函式表的最後,在vs2013環境下會以00 00 00 00作為虛函式表的結束標誌。

呼叫過程:

①從物件的前四個位元組取出虛函式表的位址。

②傳遞引數(虛函式形參+this指標)。

③從虛函式表中取出虛函式的位址。

④呼叫該虛函式。

C 中的多型

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

C 中的多型

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

C 中的多型

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