(C/C++學習筆記)4.C++類中的虛擬函式表Virtual Table
阿新 • • 發佈:2018-12-12
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