c 筆記 多型

2021-08-24 20:52:18 字數 1654 閱讀 9497

編譯時的多型是通過靜態連編來實現的

執行時的多型是通過動態連編來實現的

利用虛函式機制,c++可部分地採用動態連編

在c++中,編譯時的多型性主要是通過函式過載和運算子過載實現的,執行時多型性主要是通過虛函式來實現的

virtual 返回型別 函式名(形參表)

;在基類中的某個成員函式被宣告為虛函式後,此虛函式就可以在乙個或多個派生類中被重新宣告定義

虛函式在派生類中重新定義時,其函式原型,包括返回型別、函式名、引數個數、引數型別的順序,都必須與基類中的原型完全相同

虛函式的判斷:

該函式與基類的虛函式有相同的名稱

該函式與基類的虛函式有相同的引數個數及相同的對應引數型別

該函式與基類的虛函式有相同的返回型別或者滿足賦值相容規則的指標、引用型的返回型別

由於虛函式使用的基礎是賦值相容規則,而賦值相容規則成立的前提條件是派生類從其基類公有派生

必須首先在基類中定義虛函式,但不必在類等級最高層類內首先宣告虛函式

在派生類對基類中宣告的虛函式進行重新定義時,關鍵字virtual可以寫也可以不寫

使用物件名和點運算子的方式也可以呼叫虛函式,但這是靜態連編

乙個虛函式無論被公有繼承多少次,它仍然保持其虛函式的特性

虛函式必須是其所在類的成員函式,而不能是友元函式,也不能是靜態成員函式

內聯函式不能是虛函式,即使虛函式在類內部定義,編譯時仍將其看作是非內聯的

建構函式不能是虛函式,但是析構函式可以是虛函式,而且通常說明為虛函式

必須使用指標才能觸發virtual特性

如果在主函式中用new運算子建立乙個派生類的無名物件和定義了乙個基類的物件指標,並將無名物件的位址賦給這個物件指標,當用delete運算子撤銷無名物件時,系統只執行基類的析構函式,而不執行派生類的析構函式

virtual ~類名()

;雖然派生類的析構函式與基類的析構函式名字不相同,但是如果將基類的析構函式定義為虛函式,有基類所派生的所有派生類的析構函式也都自動成為虛函式

普通的函式過載時,其函式的引數或引數型別必須有所不同,函式的返回型別也可以不同

當過載乙個虛函式時,要求函式名、返回型別、引數個數、引數的型別和順序與基類中的虛函式原型完全相同

如果僅僅返回型別不同,其餘均相同,系統會給出錯誤資訊

若僅僅函式名相同,而引數的個數、型別或順序不同,系統將它作為普通的函式過載,這是將丟失虛函式的特性

virtual 函式型別 函式名(參數列)=0;

純虛函式沒有函式體,他最後面的「=0」並不表示函式的返回值為0,它只是形式上的作用,告訴編譯系統「這是純虛函式」

純虛函式不具備函式的功能,不能被呼叫

如果乙個類至少有乙個純虛函式,那麼就稱該類為抽象類

由於抽象類中至少包含乙個沒有定義功能的純虛函式,因此,抽象類只能作為其他類的基類來使用,不能建立抽象類物件

不允許從具體類派生出抽象類,所謂具體類,就是不包含純虛函式的普通類

抽象類不能用作函式的引數型別、函式的返回型別或顯示轉換的型別

可以宣告指向抽象類的指標或引用

如果派生類中沒有定義純虛函式的實現,而派生類只是繼承基類的純虛函式,則這個派生類仍然是乙個抽象類,如果派生類中給出了基類純虛函式的實現,則該派生類就不再是抽象類,它是乙個可以建立物件的具體類了

c 多型筆記

if語句或switch語句會帶來混亂,且不遵守設計模式中的 開閉原則 開閉原則指的是 對擴充套件開放,對修改關閉 用多型 同乙個介面,使用不同的例項而執行不同操作 條件語句 public class test if command drivecommand.stop switch command p...

C 多型之筆記

1.繼承型別 參考部落格 私有繼承,公有繼承,和保護繼承三種,主要是子類在類內,類外使用基類的成員的許可權不同。例如,基類a,b繼承a,c繼承b b繼承a的方式有兩方面的影響 b在類內 類外使用a成員的許可權 c在類內 類外使用a成員的許可權 測試 如下 class a class b public...

C 學習筆記 多型

引言 1.虛繼承 如果乙個派生類從多個基類派生,而這些基類又有乙個共同的基類,則在對該基類中宣告的名字進行訪問時,可能產生二義性。解決方案 虛繼承宣告,加乙個virtual 關鍵字 2.物件導向新需求 編譯器的做法不是我們期望的 如果用父類指標指向子類物件,再呼叫print 方法,均會呼叫父類中的p...