靜態繫結和動態繫結是c++多型性的一種特性。
物件在宣告是採用的型別,在編譯期確定;
當前物件所指的型別,在執行期決定,物件的動態型別可以更改,但靜態型別無法更改。
class b;
class c: public b;
class d: public b;
d* pd=new d();
// pd的靜態型別是它宣告的型別d*,動態型別也是d*
b* pb=pd;
// pb的靜態型別是它宣告的型別b*,動態型別是pb所指的物件pd的型別d*
c* pc=new c();
// pc的靜態型別是它宣告的型別c*,動態型別也是c*
pb=pc;
// pb的動態型別可以改變,現在它的動態型別為c*
繫結的是物件的靜態型別,某特性(比如函式)依賴於物件的靜態型別,發生在編譯期。
繫結的是物件的動態型別,某特性(比如函式)依賴於物件的動態型別,發生在執行期。
class b;
class c: public b;
class d: public b;
d* pd=new d();
// pd的靜態型別是它宣告的型別d*,動態型別也是d*
b* pb=pd;
// pb的靜態型別是它宣告的型別b*,動態型別是pb所指的物件pd的型別d*
pd->dosomething()和pb->dosomething()呼叫的是同乙個函式嗎?
答案:不是的,雖然pd和pb指向同一物件,但函式dosomething是乙個non-virtual函式,它是靜態繫結的,也就是編譯器會在編譯器根據物件的靜態型別來選擇函式,pd的靜態型別是d*,那麼編譯器在處理pd->dosomething()的時候會將它指向d::dosomething()。同理,pb的靜態型別是b*,那麼pb->dosomething()呼叫的就是b::dossomething()。
pd->vfun()和pb->vfun()呼叫的是同一函式嗎?
答案:是的,vfun是個虛函式,它是動態繫結的,也就是它繫結的是物件的動態型別,pb和pd雖然靜態型別不同,但他們同時指向乙個物件,他們的動態物件是相同的,都是d*,所以,他們呼叫的是同乙個函式:d::vfun()。
上面都是針對物件指標的情況,對於引用(reference)的情況同樣適用。
指標和引用的動態型別和靜態型別可能會不一致,但是物件的動態型別和靜態型別是一致的。
d d;
d.dosomething()和d.vfun()永遠呼叫的都是d::dosomething()和d::vfun()。
總結:只有虛函式才使用的是動態繫結,其他的全部是靜態繫結。
當預設引數和虛函式一起出現的時候情況有點複雜,極易出錯。我們知道,
虛函式是動態繫結的,但是為了執行效率,預設引數是靜態繫結的。
class b;
class d: public b;
d* pd=new d();
// pd的靜態型別是它宣告的型別d*,動態型別也是d*
b* pb=pd;
// pb的靜態型別是它宣告的型別b*,動態型別是pb所指的物件pd的型別d*
pd->vfun();
pb->vfun();
有上面的分析可知,pd->vfun()和pb->vfun()呼叫都是函式d::vfun(),但是他們的預設引數是多少?
分析一下,預設引數是靜態繫結的,pd->vfun(),pd的靜態型別是d*,所以它的預設引數是20;而pb的靜態型別是b*,所以pb->vfun()的預設引數是10.
對於這個特性,估計沒有人會喜歡。所以,永遠記住:
「絕不重新定義繼承而來的預設引數(never redefine function』s inherited default parameters value.)」
mysql多型關聯 多型與多型性 繫結與非繫結
什麼是多型 多型指的是一類事物有多種形態,比如動物有多種形態 人 狗 豬 class animal 同一類 動物 pass class people animal 形態一 人 pass class dog animal 形態二 狗 pass class pig animal 形態三 豬 pass 為...
IOS開發中的多型性 動態型別和動態繫結
1.多型性 多型性是個生物名詞,用來表示生物體在生命週期中的不同形態,用在程式語言中則表示相同的方法名,但是卻有不同的實現方式。或者說相同的名字,不同的類。我們來看乙個書上的示例 import 定義類 a inte ce a nsobject void print end implementatio...
C 的靜態多型性和動態多型性(學習心得 20)
同乙個行為,具有多個不同表現形式或形態的能力。在物件導向程式設計正規化中,多型性往往表現為 乙個介面,多個功能 多型性可以是靜態的或動態的 在 c 中,每個型別都是多型的,因為包括使用者定義型別在內的所有型別都繼承自 object。同乙個事件發生在不同的物件上會產生不同的結果。超級小白友好,講解c ...