動態繫結與靜態繫結

2022-07-24 15:09:27 字數 2064 閱讀 3451

對指標來說:

動態型別與靜態型別:

動態型別是所指向的物件型別,這發生在程式執行期,靜態型別是宣告時指標時候,指標本身的型別,這發生在編譯期

所以說靜態型別宣告好後就不發生改變了,動態型別,可以執行改變,也就是允許指向不同的物件型別

如:

//

基類classa;

//子類

class b:publica;

//pa靜態型別為 a ,動態型別也是 a

a *pa = new

a();

//pb靜態型別為b,動態型別也是b

b *pb = new

b();

//paa靜態型別為a ,動態型別為b

a *paa = new

b();

//pb靜態型別為b。指向了a型別,現在動態型別為a

pb =pa;

//b *pbb = new a; 子類指標不能指向基類物件

動態繫結與靜態繫結:

有虛函式的地方就是動態繫結,沒有虛函式的地方是靜態繫結

(根據字面意思理解,靜態繫結就是根據靜態型別來繫結某種操作,動態型別就是根據動態型別來繫結某種操作)

如:

1

//基類

2classa3

9void

f1()

1013

};14

//子類

15class b:publica16

23//

24void

f1()

2528

};29

//pa靜態型別為 a ,動態型別也是 a

30 a *pa = new

a();

31//

pb靜態型別為b,動態型別也是b

32 b *pb = new

b();

33//

paa靜態型別為a ,動態型別為b

34 a *paa = new b();

根據物件是靜態型別(哪一種)還是動態型別(哪一種)確定所呼叫的函式屬於哪個類

對於pa->f()paa->f()

f()為虛函式,屬於動態繫結

因此,由於pa的動態型別為a,所以pa->f()呼叫的f()為 a::f();

同理,paa的動態型別為b,所以paa->f()所呼叫的f()為 b::f();

對於pa->f1(),paa->f1()

f1()為非虛函式,屬於靜態繫結

因此,由於pa ,paa的靜態型別均為a,所以其呼叫的f1()均屬於a

對於虛函式,不用重新定義預設實參。因為對於子類和基類物件來說呼叫的是同乙個虛函式,但是如果重新定義預設實參,會導致同乙個函式,但是預設實參不同,發生不同的事情

如:

//

基類class

a

void

f1()

};//

子類class b:public

a

//void

f1()

};a *pa = newa();

b *pb = newb();

pb =pa; //此時pb的動態型別變為a

注意:預設引數是靜態繫結的

pa, pb 指向同乙個物件,但是由於 pa, pb 靜態型別分別屬於a,b

所以,當出現 pa->f()和pb->f() 時候,它倆動態型別均為a,所呼叫的f()屬於a 類

但是由於預設引數是和靜態型別繫結的,所以pa->f()

中的預設實參是5,pb->f()

的預設實參是10, 不同。

故:不要重新定義預設實參。

動態繫結與靜態繫結

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

java動態繫結與靜態繫結

首先需要了解方法的呼叫過程 1.編譯器檢視物件宣告型別與方法。假設呼叫x.f param 且隱式引數型別x宣告為c型別的物件。需要注意的是 可能存在多個名稱為f的方法,但是引數型別不一樣,例如f string f int 這時編譯器會列舉 出c類中方法名為f和c類的父類中修飾符為public的f方法...

C 動態繫結與靜態繫結

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