C++語法學習(6)

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.抽象類

含有純虛函數的類

抽象類不能用於直接創建對象實例,可以聲明抽象類的指針,引用

可以用指向抽象類的指針支持運行時多態性

派生類中必須實現基類中的純虛函數,否則仍被看做一個抽象類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章