搜尋
首頁php教程PHP开发深入理解C++的動態綁定與靜態綁定的應用詳解

為了支援c++的多態性,才用了動態綁定和靜態綁定。理解他們的差異有助於更好的理解多態性,以及在程式設計的過程中避免犯錯。
需要理解四個名詞:
1、物件的靜態型別:物件在宣告時所採用的型別。是在編譯期確定的。
2、物件的動態型別:目前所指物件的型別。是在運行期決定的。物件的動態類型可以更改,但是靜態類型無法更改。
關於物件的靜態類型和動態類型,看一個範例:

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();
pB = pC;//pB的动态类型是可以更改的,现在它的动态类型是C*

3、靜態綁定:綁定的是物件的靜態類型,某特性(例如函數)依賴物件的靜態類型,發生在編譯期。
4、動態綁定:綁定的是物件的動態類型,某特性(例如函數)依賴物件的動態類型,發生在運行期。

class B
{
    void DoSomething();
    virtual void vfun();
}
class C : public B
{
    void DoSomething();//首先说明一下,这个子类重新定义了父类的no-virtual函数,这是一个不好的设计,会导致名称遮掩;这里只是为了说明动态绑定和静态绑定才这样使用。
    virtual void vfun();
}
class D : public B
{
    void DoSomething();
    virtual void vfun();
}
D* pD = new D();
B* pB = pD;

讓我們看一下,pD->DoSomething()和pB->DoSomething()呼叫的是同一個函數嗎?
不是的,雖然pD和pB都指向同一個物件。因為函數DoSomething是一個no-virtual函數,它是靜態綁定的,也就是編譯器會在編譯期間根據物件的靜態類型來選擇函數。 pD的靜態類型是D*,那麼編譯器在處理pD->DoSomething()的時候會將它指向D::DoSomething()。同理,pB的靜態型別是B*,那pB->DoSomething()呼叫的就是B::DoSomething()。
讓我們再來看一下,pD->vfun()和pB->vfun()呼叫的是同一個函數嗎?
是的。因為vfun是一個虛擬函數,它動態綁定的,也就是說它綁定的是對象的動態類型,pB和pD雖然靜態類型不同,但是他們同時指向一個對象,他們的動態類型是相同的,都是D*,所以,他們的呼叫的是同一個函數:D::vfun()。
上面都是針對物件指標的情況,對於引用(reference)的情況也同樣適用。
指標和引用的動態類型和靜態類型可能會不一致,但是物件的動態類型和靜態類型是一致的。
D D;
D.DoSomething()和D.vfun()永遠呼叫的都是D::DoSomething()和D::vfun()。
至於那些事動態綁定,那些事靜態綁定,有篇文章總結的非常好:
我總結了一句話:只有虛函數才使用的是動態綁定,其他的全部是靜態綁定。目前我還沒有發現不適用這句話的,如果有錯誤,希望你可以指出來。
特別要注意的地方
當缺省參數和虛函數一起出現的時候情況有點複雜,極易出錯。我們知道,虛函數是動態綁定的,但是為了執行效率,預設參數是靜態綁定的。

class B
{
 virtual void vfun(int i = 10);
}
class D : public B
{
 virtual void vfun(int i = 20);
}
D* pD = new D();
B* pB = pD;
pD->vfun();
pB->vfun();
有上面的分析可知pD->vfun()和pB->vfun()呼叫都是函數D::vfun(),但是他們的預設參數是多少?
分析一下,缺省參數是靜態綁定的,pD->vfun()時,pD的靜態型別是D*,所以它的缺省參數應該是20;同理,pB->vfun()的缺省參數應該是10。寫程式驗證了一下,正確。
對於這個特性,估計沒有人會喜歡。所以,永遠記住:
「絕不重新定義繼承而來的缺省參數(Never redefine function's inherited default parameters value.)」
關於c++語言
目前我基本上都是在c++的子集「物件導向程式設計「下工作,對於更複雜的知識了解的還不是很多。即便如此,到目前為止程式設計時需要注意的東西已經很多,而且後面可能還會繼續增多,這也許是很多人反對c++的原因。

c++是Google的四大官方語言之一。但是Google近年來確推出了go語言,而且定位是和c/c++相似。考慮這種情況,我認為可能是Google的程式設計師深感c++的複雜,所以想開發一種c++的替代語言。有時間要了解一下go語言,看看它在類似c++的問題上時如何取捨的。

更多深入理解C++的動態綁定與靜態綁定的應用詳解相關文章請關注PHP中文網!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器