為了支援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 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...