C 靜態繫結與動態繫結

2021-08-21 17:07:03 字數 1040 閱讀 5424

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靜態型...