靜態編譯和動態編譯(函數)實現

來源:互聯網
上載者:User
資料來源於網路 在C++中,聯編是指一個電腦程式的不同部分彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法:靜態聯編和動態聯編。  1.  靜態聯編 靜態聯編是指聯編工作在編譯階段完成的,這種聯編過程是在程式運行之前完成的,又稱為早期聯編。要實現靜態聯編,在編譯階段就必須確定程式中的操作調用(如函數調用)與執行該作業碼間的關係,確定這種關係稱為束定,在編譯時間的束定稱為靜態束定。靜態聯編對函數的選擇是基於指向對象的指標或者引用的類型。其優點是效率高,但靈活性差.   

2. 動態聯編

動態聯編是指聯編在程式運行時動態地進行,根據當時的情況來確定調用哪個同名函數,實際上是在運行時虛函數的實現。這種聯編又稱為晚期聯編,或動態束定。動態聯編對成員函數的選擇是基於對象的類型,針對不同的物件類型將做出不同的編譯結果。C++中一般情況下的聯編是靜態聯編,但是當涉及到多態性和虛函數時應該使用動態聯編。動態聯編的優點是靈活性強,但效率低。

動態聯編規定,只能通過指向基類的指標或基類對象的引用來調用虛函數,其格式為:指向基類的指標變數名->虛函數名(實參表)或基類對象的引用名.虛函數名(實參表)

 

實現動態聯編需要同時滿足以下三個條件:

①    必須把動態聯編的行為定義為類的虛函數

②    類之間應滿足父子類型關係,通常表現為一個類從另一個類公有派生而來。

③    必須先使用基類指標指向子類型的對象,然後直接或者間接使用基類指標調用虛函數

 

3. 動態聯編分析

 動態聯編要求衍生類別中的虛函 數與基類中對應的虛函數具有相同的名稱、相同的參數個數和相同的對應參數類型、傳回值或者相同,或者都返回指標或引用,並且衍生類別虛函數所返回的指標或引 用的基底類型是基類中虛函數所返回的指標或引用的基底類型的子類型。如果不滿足這些條件,衍生類別中的虛函數將丟失其虛特性,在調用時進行靜態聯編。(隱藏)

 

4. 小結

從以上四個例子中可以看出:虛函數是實現多態的基礎,是實現動態聯編的必要條件之一。動態聯編要靠虛函數來實現,虛函數要靠動態聯編的支援。兩者相輔相成,缺一不可。

 

所以

多態實現可分為:

靜態動態(編譯時間多態):主要通過函數和運算子多載來實現;

動態動態(運行時多態):主要通過繼承和虛函數來實現.

(函數重載說的簡單就是: 類中存在相同函數名且參數列表不同的多個函數,可稱之為函數重載.) 

多態性的實現與靜態聯編、動態聯編有關。靜態聯編支援的多態性稱為編譯時間的多態性,也稱靜態多態性,它是通過函數重載和運算子

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.