多態實現的原理------新標準c++程式設計

來源:互聯網
上載者:User

標籤:++   例子   cpp   其他   include   結果   mes   post   stream   

  “多態”的關鍵在於通過基類指標或引用調用一個虛函數時,編譯時間不確定到底調用的是基類還是衍生類別的函數,運行時才確定。例子:

#include<iostream>using namespace std;class A{public:int i;virtual void func(){};virtual void func2(){};            //如果為只有一個去掉 virtual 關鍵字即virtual void func2(){};變為 void func2(){}; 輸出結果不變 仍為 8,12 };                                                   //當 virtual 關鍵字都去掉時,結果才為 4,8class B :public int j;void func(){}};int main(){cout<<sizeof(A)<<","<<sizeof(B);};

  輸出結果:

8,12

  如果將程式中的 virtual 關鍵字去掉:

#include<iostream>using namespace std;class A{public:int i;void func(){};void func2(){};};class B :public A{int j;void func(){}};int main(){cout<<sizeof(A)<<","<<sizeof(B);};

  輸出結果:

4,8

  對比發現,有了虛函數以後,對象佔用的儲存空間比沒有虛函數時多了4個位元組。實際上,任何有虛函數的類及其衍生類別的對象都包含這多出來的4個位元組,這4個位元組就是實現多態的關鍵——它位於Object Storage Service空間的最前端,其中存放虛函數表的地址。

  每一個有虛函數的類(或有虛函數的類的衍生類別)都有一個虛函數表,該表的任何對象中都放著該虛函數表的指標(可以認為這是由編譯器自動添加到建構函式中的指令完成的)。虛函數表是編譯器產生的,程式運行時被載入記憶體。一個類的虛函數表中列出了該類的全部虛函數地址。例如,在上面的程式中,類A對象的儲存空間以及虛函數表(假定類A還有其他虛函數)

 

  類B對象的儲存空間以及虛函數表(假定類B還有其他虛函數)

  多態的函數調用語句被編譯成根據基類指標所指向的(或基類引用所引用的)對象中存放的虛函數表的地址,在虛函數表中尋找虛函數地址,並調用虛函數的一系列指令。

  假設pa的類型是A*,則pa->func()這條語句的執行過程如下:

    (1)取出pa指標所指位置的前4個位元組,即對象所屬的類的虛函數表的地址(在64位電腦中,由於指標佔8個位元組,所以要取出8個位元組)。如果pa指向的是類A的對象,則這個地址就是類A的虛函數表的地址;如果pa指向的是類B的對象,則這個地址就是類B的虛函數表的地址。

    (2)根據虛函數表的地址找到虛函數表,在其中尋找要調用的虛函數的地址。不妨認為虛函數表是以函數名作為索引來尋找的,雖然還有更高效的尋找方法。如果pa指向的是類A的對象,自然就會在類A的虛函數表中尋找A::func的地址;如果pa指向的是類B的對象,就會在類B的虛函數表中查出B::func的地址。類B沒有自己的func2函數,因此在類B的虛函數表中儲存的是A::func2的地址,這樣,即便pa指向類B的對象,"pa->func2();"這條語句在執行過程中也能在類B的虛函數表中找到A::func2的地址。

    (3)根據找到的虛函數的地址調用虛函數。

  由以上過程可以看出,只要是通過基類指標或基類引用調用虛函數的語句,就一定是多態的。也一定會執行上面的查表過程,哪怕這個虛函數僅在基類中有,在衍生類別中沒有。

 

 新標準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.