一、如果子類定義了父類中原型相同的函式會發生什麼?
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...