(C++)C++多態性中的靜態繫結和動態綁定

來源:互聯網
上載者:User

標籤:

靜態繫結和動態綁定是C++多態性的一種特性。

1、對象的靜態類型和動態類型:
  • 對象的靜態類型:

對象在聲明是採用的類型,在編譯期確定;

  • 對象的動態類型:

當前對象所指的類型,在運行期決定,對象的動態類型可以更改,但靜態類型無法更改。

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*
2、靜態繫結和動態綁定
  • 靜態繫結:

綁定的是對象的靜態類型,某特性(比如函數)依賴於對象的靜態類型,發生在編譯期。

  • 動態綁定:

綁定的是對象的動態類型,某特性(比如函數)依賴於對象的動態類型,發生在運行期。

class B{    void DoSomething();    virtual void vfun();};class C: public B{    //首先說明一下,這個子類重新定義了父類的no-virtual函數,這是一個不好的設計,會導致名稱遮掩;這裡只是為了說明動態綁定和靜態繫結才這樣使用。      void DoSomething();    virtual void vfun();};class D: public B{    void DoSomething();    virtual void vfun();};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{    void DoSomething();    virtual void vfun(int i=10);};class D: public B{    void DoSomething();    virtual void vfun(int i=20);};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.)”

 

參考文章:

http://blog.csdn.net/chgaowei/article/details/6427731

(C++)C++多態性中的靜態繫結和動態綁定

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.