對指標來說:
動態型別與靜態型別:
動態型別是所指向的物件型別,這發生在程式執行期,靜態型別是宣告時指標時候,指標本身的型別,這發生在編譯期
所以說靜態型別宣告好後就不發生改變了,動態型別,可以執行改變,也就是允許指向不同的物件型別
如:
//基類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 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...