c 的動態繫結和靜態繫結及多型的實現原理 摘

2022-06-26 10:54:09 字數 1267 閱讀 9004

c++多型的實現原理

為了支援c++的多型性,才用了動態繫結和靜態繫結。理解它們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤。

需要理解四個名詞:物件的靜態型別:物件在宣告時採用的型別。是在編譯期確定的。

物件的動態型別:當前物件的型別。是在執行期決定的。

物件的動態型別可以更改,但是靜態型別無法更改。

注:要實現動態繫結一定要使用指標或者引用來呼叫。

class

bclass 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*

靜態繫結:繫結的是物件的靜態型別,某特性(比如函式)依賴於物件的靜態型別,發生在編譯期。(物件在編譯時期根據其實際的型別(靜態型別)呼叫相應的函式)

動態繫結:繫結的是物件的動態型別,某特性(比如函式)依賴於物件的動態型別,發生在執行期。(物件在執行時期根據其實際的型別(動態型別)呼叫相應的函式)

class

bclass c : public

bclass d : public

bd* pd = new

d();

b* pb = pd;

class

bclass 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...