1. 程式人生 > >(C/C++學習筆記)4.C++類中的虛擬函式表Virtual Table

(C/C++學習筆記)4.C++類中的虛擬函式表Virtual Table

1 #include <iostream> 2 using namespace std; 3 4 class base 5 { 6 public: 7 virtual void f(){cout<<"base::f()"<<endl;} 8 virtual void g(){cout<<"base::g()"<<endl;} 9 virtual void h(){cout<<"base::h()"<<endl;} 10 private: 11 int
a; 12 }; 13 14 //定義一個函式指標,並別名為pfunc,用時不需再加*, 15 typedef void (*pfunc)(void); 16 17 int main() 18 { 19 base b; 20 21 //C++編譯器使虛擬函式表的指標存在於物件例項中的最前面(四個位元組) 22 cout<<"sizeof(base) = "<<sizeof(base)<<'\t'<<"sizeof(b) = "<<sizeof(b)<<endl<<'\n'; 23
24 //分別列印物件b的起始地址和虛擬函式表中首個函式指標指向的地址 25 //物件例項最前面的四個位元組為指向虛擬函式表的指標,取內容後才為虛擬函式表 26 cout<<"&b = "<<&b<<"\t\t"<<"&VTable = "<<(int **)*(int *)(&b)<<endl<<"\n\n"; 27 28 pfunc pf; 29 //定義一個函式指標 30 void(*p)(void); 31 //還可以這樣定義一個函式指標
32 33 //虛擬函式表裡面存放的是指向各個虛擬函式的指標,取內容後才是各個相應的虛擬函式 34 pf = (pfunc)*((int **)*(int *)(&b)+0); 35 pf(); 36 pf = (pfunc)*((int **)*(int *)(&b)+1); 37 pf(); 38 pf = (void(*)())*((int **)*(int *)(&b)+2); 39 pf(); 40 41 cout<<"\n\n"; 42 43 p = (pfunc)*((int **)*(int *)(&b)+0); 44 p(); 45 p = (void(*)())*((int **)*(int *)(&b)+1); 46 p(); 47 p = (void(*)())*((int **)*(int *)(&b)+2); 48 p(); 49 50 return 0; 51 } 52