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.抽象類
含有純虛函數的類
抽象類不能用於直接創建對象實例,可以聲明抽象類的指針,引用
可以用指向抽象類的指針支持運行時多態性
派生類中必須實現基類中的純虛函數,否則仍被看做一個抽象類