可到 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 功能