學習c (7)多型

2021-08-22 03:23:50 字數 2005 閱讀 5251

一、如果子類定義了父類中原型相同的函式會發生什麼?

1、函式重寫

在子類中定義與父類中原型相同的函式

函式重寫只發生在父類與子類之間

2、過載與重寫區別:

(1)過載:同乙個作用域;

子類無法過載父類函式,父類同名函式將被覆蓋;

過載是在編譯期間根據引數型別和個數決定;

(2)重寫:發生於父類、子類之間;

父類和子類函式有相同的函式原型;

使用virtual關鍵字宣告後能夠產生多型;

執行期間根據具體物件型別決定呼叫的函式

二、多型成立的三個條件

1、要有繼承

2、要有虛函式重寫

3、要有父類指標指向子類物件

三、靜態聯編和動態聯編

1、聯編是指乙個程式模組、**之間互相關聯的過程。

2、靜態聯編(static binding),是程式的匹配、連線在編譯階段實現,也稱為早期匹配。

過載函式使用靜態聯編。

3、動態聯編是指程式聯編推遲到執行時進行,所以又稱為晚期聯編(遲繫結)。

switch 語句和 if 語句是動態聯編的例子。

4、理論聯絡實際

(1)c++與c相同,是靜態編譯型語言

(2)在編譯時,編譯器自動根據指標的型別判斷指向的是乙個什麼樣的物件;所以編譯器認為父類指標指向的是父類物件。

(3)由於程式沒有執行,所以不可能知道父類指標指向的具體是父類物件還是子類物件

從程式安全的角度,編譯器假設父類指標只指向父類物件,因此編譯的結果為呼叫父類的成員函式。這種特性就是靜態聯編。

四、虛析構函式:通過父類指標釋放子類物件

在什麼情況下應當宣告虛函式:

五、多型實現的原理

1、說明1:

通過虛函式表指標vptr呼叫重寫函式是在程式執行時進行的,因此需要通過定址操作才能確定真正應該呼叫的函式。而普通成員函式是在編譯時就確定了呼叫的函式。在效率上,虛函式的效率要低很多。

2、說明2:

出於效率考慮,沒有必要將所有成員函式都宣告為虛函式

3、說明3 :

c++編譯器,執行run函式,不需要區分是子類物件還是父類物件

六、建構函式中能否使用虛函式實現多型

1、構造的順序是先構造父類、再構造子類

2、當呼叫父類的建構函式的時候,虛函式指標vfptr 指向父類的虛函式表。

3、當父類構造完,呼叫子類的建構函式的時候,虛函式指標 vfptr 指向子類的虛函式表

結論:建構函式中無法實現多型

七、不要用父類指標指向子類陣列

1、指標也是一種資料型別,c++類物件的指標p++/–,仍然可用。

2、指標運算是按照指標所指的型別進行的。

3、父類p++與子類p++步長不同;不要混搭,不要用父類指標++方式操作子類物件陣列

附註:

在虛繼承中,當不同的父類指標指向多繼承的派生類物件,父類指標只可以訪問自身成員變數,而不是派生類物件的全部成員變數。

#include 

using

namespace

std;

class a

;class a1 : virtual

public a

;class a2 : virtual

public a

;class b : public a1, public a2

};int main()

C 學習筆記(7) 多型

物件導向開發有三大特性 特點 特徵 封裝,繼承,多型。在繼承關係的前提下,例項化出不同的物件,這些物件呼叫相同的方法,但是卻表現出不同的行為,這就叫做多型。在c 語言中體現多型有三種方式 虛方法,抽象類,介面。父類 public virtual 返回值型別 方法名 子類 public overrid...

C 7 函式引數的擴充套件

int mul int x 0 int main int argc,char ar int mul int x 問題 函式定義中是否可以出現引數的預設值?當函式宣告和定義中的引數預設值不同時會發生什麼?當有函式宣告時,函式定義中不可以出現預設引數,否則編譯器報錯 當沒有函式宣告時,函式定義中可以出現...

C 7程式設計模式與實踐

c 7是乙個重大更新,其中提供了很多有意思的新功能。雖然已有大量的文章介紹這些功能可以做什麼,但是鮮有文章介紹應如何使用這些功能。本文將過一遍 net設計規範 net約定慣用法與模式 譯者注 英文書名為 framework design guidelines conventions,idioms,a...