天天看點

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

含有純虛函數的類

抽象類不能用于直接建立對象執行個體,可以聲明抽象類的指針,引用

可以用指向抽象類的指針支援運作時多态性

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