c++中由於繼承導致物件的指標和引用具有兩種不同的型別,靜態型別和動態型別。
物件的靜態型別:物件在宣告時採用的型別,在編譯時確定;
物件的動態型別:目前所指物件的型別,在執行期時確定。
特別說明:靜態型別是,指標或引用宣告時的型別;動態型別是,指標或引用實際指向的型別。
靜態繫結:繫結的是物件的靜態型別,(函式)依賴於物件的靜態型別,發生在編譯時期
動態繫結:繫結的是物件的動態型別,(函式)依賴於物件的動態型別,發生在執行時期
特別說明:virtual構成動態繫結,no-virtual構成靜態繫結。
a.重寫(override)
override指基類的某個成員函式為虛函式,派生類又定義一成員函式,除函式體的其餘部分都與基類的成員函式相同。注意,如果只是函式名相同,形參或返回型別不同的話,就不能稱為override,而是hide。
b.過載(overload)
指同乙個作用域出生多個函式名相同,但是形參不同的函式。編譯器在編譯的時候,通過實參的個數和型別,選擇最終呼叫的函式。
c.隱藏(hide)
分為兩種:1)區域性變數或者函式隱藏了全域性變數或者函式;2)派生類擁有和基類同名的成員函式或成員變數。
產生的結果:使全域性或基類的變數、函式不可見。
首先,虛函式是通過虛函式指標與虛函式表實現的。虛函式指標位於物件記憶體首位址,指向所屬物件的虛函式表(這句話是實現動態繫結的關鍵)。
例如:class b:public a{};
b b;
a *p=&b;
父類指標p指向子類b的物件時,指標p靜態繫結了a類,便只能訪問a內成員,但是!!!!!當p呼叫虛函式時,會預設呼叫虛函式指標,又因為虛函式指標指向的是物件的虛函式表。這裡需要清楚兩個點:1、 a *p 時並沒有分配記憶體,而a *p = new a ()才分配了記憶體;2、虛函式指標是能是在物件b的記憶體中。此時,通過父類指標p呼叫虛函式時,便訪問了子類物件中的成員函式,從而實現了動態繫結!!!
預設引數(指定了個固定值)和虛函式一起時的複雜情況,虛函式是動態繫結,但為了執行效率預設引數是靜態繫結。
C 動態繫結與靜態繫結
為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤。需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...
動態繫結與靜態繫結
為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤。需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...
動態繫結與靜態繫結
對指標來說 動態型別與靜態型別 動態型別是所指向的物件型別,這發生在程式執行期,靜態型別是宣告時指標時候,指標本身的型別,這發生在編譯期 所以說靜態型別宣告好後就不發生改變了,動態型別,可以執行改變,也就是允許指向不同的物件型別 如 基類classa 子類 class b publica pa靜態型...