C 理解 多型 之 靜態繫結與動態繫結

2021-10-23 19:07:19 字數 1481 閱讀 8057

為了支援c++的多型性,才用了動態繫結與靜態繫結。

物件在宣告時候的型別,是在編譯時期確定的。

目標所指向的物件,是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更改。

示例:

class

bclassc:

public

bclassd:

publicbd

* pd =

newd()

;//pd的靜態型別是它宣告的型別d*,動態型別也是d*

b* pb = pd;

//pb的靜態型別是它宣告的型別b*,動態型別是pb所指向的物件pd的型別d*

c* pc =

newc()

;pb = pc;

//pb的動態型別是可以更改的,現在它的動態型別是c*

繫結的是靜態型別,比如函式依賴於物件的靜態型別,發生在編譯期。

繫結的是動態型別,比如函式依賴於物件的動態型別,發生在執行期。

示例:

class

bclassc:

public

bclassd:

publicbd

* pd =

newd()

;b* pb = pd;

pd -

>

dosomething()

;//(1)

pb -

>

dosomething()

;//(2)

pd -

>

vfun()

;//(3)

pb -

>

vfun()

;//(4)

(1) 和 (2) 呼叫的是不同的函式。

因為dosomething函式不是虛函式,是靜態繫結的,在編譯器時期會根據物件的型別選擇函式。

pd的靜態型別是d*,pb的靜態型別是b*。所以(1)呼叫的是d::dosomething();(2)呼叫的是b::dosmething()。

(3)和(4)呼叫的是相同的函式。

因為vfun函式是虛函式,是動態繫結的,繫結的是物件的動態型別。

pb雖然和pd的靜態型別不同,但是他們指向同乙個物件,動態型別是相同的,都是d*。所以呼叫的都是d::vfun()。

總結:只有虛函式才有動態繫結,其他的都是靜態繫結。

虛函式是動態繫結的,預設引數是靜態繫結的。

示例:

class

bclassd:

publicbd

* pd =

newd()

;b* pb = pd;

pd->

vfun()

;//a

pb->

vfun()

;//b

a與b 呼叫的都是d::vfun(),但是預設引數是自己各自靜態型別的。

絕不重新定義繼承而來的預設引數

C 動態繫結與靜態繫結

為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤。需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...

C 靜態繫結與動態繫結

c 中由於繼承導致物件的指標和引用具有兩種不同的型別,靜態型別和動態型別。物件的靜態型別 物件在宣告時採用的型別,在編譯時確定 物件的動態型別 目前所指物件的型別,在執行期時確定。特別說明 靜態型別是,指標或引用宣告時的型別 動態型別是,指標或引用實際指向的型別。靜態繫結 繫結的是物件的靜態型別,函...

動態繫結與靜態繫結

為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤。需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...