1.函數重寫
在子類中定義與父類中原型相同的函數
函數重寫隻發生在父類與子類之間
重載與重寫差別:
重載:同一個作用域;
子類無法重載父類函數,父類同名函數将被覆寫;
重載是在編譯期間根據參數類型和個數決定;
重寫:發生于父類、子類之間;
父類和子類函數有相同的函數原型;
使用virtual關鍵字聲明後能夠産生多态;
運作期間根據具體對象類型決定調用的函數。
2.根據實際的對象類型來判斷重寫函數的調用
如果父類指針指向的是父類對象則調用父類中定義的函數
如果父類指針指向的是子類對象則調用子類中定義的重寫函數
3.多态成立的三個條件
1、要有繼承
2.要有繼承函數重寫
3.用父類指針指向子類對象
4.1、聯編是指一個程式子產品、代碼之間互相關聯的過程。
2、靜态聯編(static binding),是程式的比對、連接配接在編譯階段實作,也稱為早期比對。
重載函數使用靜态聯編。
3、動态聯編是指程式聯編推遲到運作時進行,是以又稱為晚期聯編(遲綁定)。
switch 語句和 if 語句是動态聯編的例子。
4、理論聯系實際
1、C++與C相同,是靜态編譯型語言
2、在編譯時,編譯器自動根據指針的類型判斷指向的是一個什麼樣的對象;是以編譯器認為父類指針指向的是父類對象。
3、由于程式沒有運作,是以不可能知道父類指針指向的具體是父類對象還是子類對象
從程式安全的角度,編譯器假設父類指針隻指向父類對象,是以編譯的結果為調用父類的成員函數。這種特性就是靜态聯編。
5.
在什麼情況下應當聲明虛函數
構造函數不能是虛函數。建立一個派生類對象時,必須從類層次的根開始,沿着繼承路徑逐個調用基類的構造函數
析構函數可以是虛的。虛析構函數用于指引 delete 運算符正确析構動态對象
虛析構函數:通過父類指針釋放子類對象
6. 構造的順序是先構造父類、再構造子類
當調用父類的構造函數的時候,虛函數指針vfptr 指向父類的虛函數表
當父類構造完,調用子類的構造函數的時候,虛函數指針 vfptr 指向子類的虛函數表
結論:構造函數中無法實作多态
7.指針也是一種資料類型,C++類對象的指針p++/--,仍然可用。
指針運算是按照指針所指的類型進行的。
父類p++與子類p++步長不同;不要混搭,不要用父類指針++方式操作子類對象數組
8.抽象類
含有純虛函數的類
抽象類不能用于直接建立對象執行個體,可以聲明抽象類的指針,引用
可以用指向抽象類的指針支援運作時多态性
派生類中必須實作基類中的純虛函數,否則仍被看做一個抽象類