多型,可分為靜態多型和動態多型。靜態多型,就是表現在靜態聯編上,即編譯時的多型,如汎型程式設計,函式過載都屬於靜態聯編。動態多型,就是表現在執行時的多型,在程式執行時,才決定呼叫什麼函式,通過虛函式來實現,換句話說,就是實現「乙個介面,多種方法」。本文的多型主要指動態多型。
多型實現條件
實現條件有3個:有繼承、有virtual重寫、有父類指標指向子類物件。
多型實現原理
當類中宣告虛函式時,編譯器會在類中生成乙個虛函式表,虛函式表是乙個儲存類成員函式指標的資料結構,虛函式表是由編譯器自動生成與維護的。virtual成員函式會被編譯器放入虛函式表中當存在虛函式時,每個物件中都有乙個指向虛函式表的指標vptr。
class p
};class c:public p
};``
void f(p *p)
`void main()
哪些函式不能定義為虛函式
只有類的成員函式才能定義為虛函式;
內聯函式,友元函式,靜態成員函式,建構函式皆不能做虛函式。
純虛函式
純虛函式是乙個在基類中沒有定義的虛函式,且要求其派生類都要定義這個虛函式。
形式上為 virtual 函式名(引數) = 0;
如
class p
;
具有純虛函式的類稱為抽象類,抽象類不能建立物件,不能作為返回型別和函式引數,但可以宣告抽象類的指標,宣告抽象類的引用。
多型的目的
便於繼承和拓展已存在的**,達到介面重用。
c 學習筆記五 多型
示例二 示例 include using namespace std class father father virtual father 將父類析構函式定義為虛函式,析構 的時候會自動也呼叫子類的析構函式 class son public father son son int main 執行結果 ...
C 複習筆記(五)主要是模板部分
1.函式模板 template void myswap t a,t b 函式模板呼叫 void main 函式模板作為函式引數 templateint mysort t1 array,t2 size void main int size sizeof myarray sizeof myarray m...
軟體構造 複習筆記五
萬用字元 只能在使用 現,不能定義 不能用instance of檢驗泛型 不能構建泛型陣列 lsp原則 子型別的規約不能弱於父型別的規約 靜態分派 編譯階段確定執行操作 動態分派 編譯階段可能繫結到多型操作,執行階段確定具體執行哪乙個 推遲繫結 編譯階段不知道型別,一定是動態分派 override是...