語言從入門到精通-第13章多態(tài)與虛函數(shù)_第1頁
語言從入門到精通-第13章多態(tài)與虛函數(shù)_第2頁
免費預(yù)覽已結(jié)束,剩余3頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

多態(tài)與虛函數(shù)靜態(tài)聯(lián)編動態(tài)聯(lián)編虛函數(shù)的聲明和定義虛函數(shù)的原理靜態(tài)聯(lián)編

靜態(tài)聯(lián)編是指聯(lián)編工作出目前編譯連接階段,這種聯(lián)編又稱早期聯(lián)編,因為這種聯(lián)編過程是在程式開始運行之前完成的。在編譯時所進行的這種聯(lián)編又稱靜態(tài)束定。在編譯時就解決了程式中的操作調(diào)用和執(zhí)行該操作代碼間的關(guān)系,確定這種關(guān)系又稱為束定,在編譯時束定又稱靜態(tài)束定?!痉独?3-1】將通過實例講述靜態(tài)聯(lián)編的概念動態(tài)聯(lián)編

動態(tài)聯(lián)編實際上是進行動態(tài)識別,在實例13.1中,前面分析過了靜態(tài)聯(lián)編時,F(xiàn)unc()函數(shù)中s所引用的對象被束定到Point類上。而在運行時進行動態(tài)聯(lián)編將把s的對象引用束定到RectAngle類上??梢?,同一個對象引用s,在不同階段被束定的類對象將是不同的。那么怎么來確定是靜態(tài)聯(lián)編還是動態(tài)聯(lián)編呢?C++規(guī)定動態(tài)聯(lián)編是在虛函數(shù)的支持下實現(xiàn)的。從上述分析能看出靜態(tài)聯(lián)編和動態(tài)聯(lián)編也都是屬于多態(tài)性的,它們是不同階段對不同實現(xiàn)進行不同的選擇。上例中,實現(xiàn)上是對Func()函數(shù)參數(shù)的多態(tài)性的選擇,該函數(shù)的參數(shù)是類的對象引用,靜態(tài)聯(lián)編和動態(tài)聯(lián)編和動態(tài)聯(lián)編實際上是在選擇它的靜態(tài)類型和動態(tài)類型,聯(lián)編是對這個引用的多態(tài)性的選擇。實現(xiàn)動態(tài)聯(lián)編必須滿足以下3個條件:必須把需要動態(tài)聯(lián)編的行為定義為類的公共屬性的虛函數(shù);類之間存在子類型關(guān)系,一般表現(xiàn)為一個類從另一個類公有派生而來;必須先使用基類指針指向子類型的對象,然后直接或者間接使用基類指針調(diào)用虛函數(shù)。虛函數(shù)的聲明和定義

虛函數(shù)必須是類的非靜態(tài)成員函數(shù)(且非構(gòu)造函數(shù)),其訪問權(quán)限是public,在基類的類定義中定義虛函數(shù)的一般形式如下:class基類名{public: virtual函數(shù)返回值類型虛函數(shù)名(形參表){

函數(shù)體 }}在定義了虛函數(shù)后,可以在基類的派生類中對虛函數(shù)重新定義,其一般形式為如下:class類名:基類名{public: virtual函數(shù)返回值類型虛函數(shù)名(形參表) {

函數(shù)體 }}【范例13-2】將通過改寫實例13.1中的Area函數(shù)為虛函數(shù)講述虛函數(shù)的定義和申明虛函數(shù)的原理

大家都知道C++中的虛函數(shù)的實現(xiàn)一般是通過虛函數(shù)表(VirtualTable)實現(xiàn)的,簡稱為V-Table。類的虛函數(shù)表是一塊連續(xù)的內(nèi)存,每個內(nèi)存單元中記錄一個JMP指令的地址。編譯器會為每個有虛函數(shù)的類創(chuàng)建一個虛函數(shù)表,該虛函數(shù)表將被該類的所有對象共享。類的每個虛成員占據(jù)虛函數(shù)表中的一行。如果類中有N個虛函數(shù),那么其虛函數(shù)表將有N*4字節(jié)的大小。在虛函數(shù)表中,主要是一個類的虛函數(shù)的地址表,它解決了繼承、覆蓋的問題,保證其真實反應(yīng)實際的函數(shù)。這樣,在有虛函數(shù)的類的實例中這個表被分配在了這個實例的內(nèi)存中,所以,當(dāng)用父類的指針來操作一個子類的時候,這張?zhí)摵瘮?shù)表就顯得由為重要了,它就像一個地圖一樣,指明了實際所應(yīng)該調(diào)用的函數(shù)。編譯器應(yīng)該是保證虛函數(shù)表的指針存在于對象實例中最前面的位置(這是為了保證取到虛函數(shù)表的有最高的性能——如果有多層繼承或是多重繼承的情況下)。這意味

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論