曬曬C++:虛函數的真相(VC編譯器如何實現“virtual ”規則)(轉載的非原創)

可到 CSDN 下載中心下載全文 http://download.csdn.net/detail/Dreamcode/201005 

( 1 )virtual 虛函數

 

先看一段簡單代碼:

Code Segment:

Line01:  #include<stdio.h>

Line02:

Line03:  class Base {

Line04:  public:

Line05:      virtual void __stdcall Output() {

Line06:         printf("Class Base\n");

Line07:     }

Line08:  };

Line09: 

Line10:  class Derive :public Base {

Line11:  public:

Line12:     void __stdcall Output() {

Line13:         printf("Class Derive\n");

Line14:     }

Line15:  };

Line16: 

Line17:  void Test(Base *p) {

Line18:     p->Output();

Line19:  }

Line20: 

Line21:  int __cdecl main(intargc, char* argv[]) {

Line22:     Derive obj;

Line23:     Test(&obj);

Line24:     return 0;

Line25:  }   

 

基類的“Output”函數是個虛函數。那麼,很明顯地,程序的運行結果將是:

 

( 2)  virtual function table  虛函數表


先來分析我們的main函數中的Derive類的對象obj,看看它的內存佈局,由於沒有數據成員,它的大小爲4個字節,只有一個vfptr,所以obj的地址也就是vfptr的地址了。

對一個C++類,如果它要呈現多態(一般的編譯器會將這個類以及它的基類中是否存在virtual關鍵字作爲這個類是否要多態),那麼類會有一個virtual function table,而每一個實例(對象)都會有一個virtual function pointer(以下簡稱vfptr)指向該類的virtual function table的起始地址,而virtual function table表格地址所對應的內存單元的內容就是虛函數地址(其實並不是真正的函數地址,而是跳轉到函數的jmp指令的地址)。

( 2 )  實現 virtual 功能

    







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章