c++多型的實現原理
為了支援c++的多型性,才用了動態繫結和靜態繫結。理解它們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤。
需要理解四個名詞:物件的靜態型別:物件在宣告時採用的型別。是在編譯期確定的。
物件的動態型別:當前物件的型別。是在執行期決定的。
物件的動態型別可以更改,但是靜態型別無法更改。
注:要實現動態繫結一定要使用指標或者引用來呼叫。
classbclass c : public
bclass d : public
bd* pd = new d();//
pd的靜態型別是它宣告的型別d*,動態型別也是d*
b* pb = pd;//
pb的靜態型別是它宣告的型別b*,動態型別是pb所指向的物件pd的型別d*
c* pc = new
c();
pb = pc;//
pb的動態型別是可以更改的,現在它的動態型別是c*
靜態繫結:繫結的是物件的靜態型別,某特性(比如函式)依賴於物件的靜態型別,發生在編譯期。(物件在編譯時期根據其實際的型別(靜態型別)呼叫相應的函式)
動態繫結:繫結的是物件的動態型別,某特性(比如函式)依賴於物件的動態型別,發生在執行期。(物件在執行時期根據其實際的型別(動態型別)呼叫相應的函式)
classbclass c : public
bclass d : public
bd* pd = new
d();
b* pb = pd;
classbclass d : public
bd* pd = new
d();
b* pb =pd;
pd->vfun();
pb->vfun();
pd->vfun()和pb->vfun()呼叫都是函式d::vfun(),但是他們的預設引數是多少?預設引數是靜態繫結的,pd->vfun()時,pd的靜態型別是d*,所以它的預設引數應該是20;同理,pb->vfun()的預設引數應該是10。
「絕不重新定義繼承而來的預設引數」
C 的動態繫結和靜態繫結
定義 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更改。eg.class b class c public b class d public b d pd new d pd的靜態型別是...
C 動態繫結和靜態繫結
學習大佬的總結 為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤。需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但...
c 動態繫結和靜態繫結
為了支援c 的多型性,才用了動態繫結和靜態繫結。1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的宣告。在執行期決定。物件的動態型別可以更改,但是靜態型別無法更改。關於物件的靜態型別和動態型別,看乙個示例 class a class b public a...