今天在網上看了一篇關于C++虛函數表的文章,讓我對C++又有了更深了的理解,文章鏈接:http://www.51cto.com/art/200712/62673_2.htm
在這篇文章中講到了通過虛函數表訪問私有的虛函數的問題,問題就出在C++在虛函數表中保存了虛函數的地址,而這個地址又很方便查找。
在每個C++對象實例的開頭存儲這這個對象的虛函數表的指針,通過這個指針可找到虛函數表,在虛函數表中就存著虛函數指針,這樣我們就可以騙過編譯器訪問私有的虛函數了。
1
class base
2

{
3
private:
4
virtual void f()
{cout<<"base_f()"<<endl;}
5
};
6
class child:public base
7

{
8
private:
9
virtual void f()
{cout<<"child_f()"<<endl;};
10
void g()
{cout<<"base_g()"<<endl;}
11
12
};
13
void main()
14

{
15
typedef void(*Fun)(void);
16
child b;
17
Fun pFun;
18
pFun = (Fun)*((int*)*(int*)(&b));
19
pFun();
20
}

2



3

4



5

6

7



8

9



10



11

12

13

14



15

16

17

18

19

20

輸出結果:child_f();
這樣就訪問了私有的虛函數了。
但是這樣只能訪問私有的虛函數,那怎么才能訪問任意的私有函數呢,像child類的g()函數,還請高人指點。