(C )C 多型性中的靜態繫結和動態繫結

2021-09-25 19:33:29 字數 1960 閱讀 3762

靜態繫結和動態繫結是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 ...