首页 > 代码库 > 虚函数表

虚函数表

 1 class B
 2 {
 3 public:
 4     virtual void fun()
 5     {
 6         printf("fun in B\n");
 7     }
 8     void b1()
 9     {
10         printf("b1 in B\n");
11     }
12 };
13 
14 class D : public B
15 {
16 public:
17     D()
18     {
19         m_d1 =10;
20     }
21     void fun()
22     {
23         printf("fun in D\n");
24     }
25     void b1()
26     {
27         printf("b1 in D\n");
28     }
29     int m_d1;
30 };
31 
32 void main()
33 { 
34     B *pb1 = new B;
35     D *pd1 = (D*)pb1;
36     pd1->fun();               //问题1,为什么是 fun in B
37     pd1->b1();                //问题2,为什么是 b1 in D
38     printf("%d\n",pd1->m_d1); //问题3,为什么是 乱码 ;
39     int a;
40     ((B*)(&a))->b1();         //问题4 ,怎么会成功?B* 强转指定要调用B类的b1()吗?强转内存地址有什么变化吗?
41 }
View Code

先参考:http://blog.csdn.net/haoel/article/details/1948051/

           http://www.linuxidc.com/Linux/2013-07/87901.htm

然后说说我的认识:

问题一:

因为new出的对象是B,所以该对象虚函数表中fun未被D中的fun覆盖,于是" fun in B"

问题二:

因为pd1指针是指向D的,所以调用b1,是去D的公共函数区调用,于是“ fun in D"

问题三:

m_d1是数据,pd1按照D的方式去取B对象的数据,而B没有这个数据,于是访问未知地址,得到乱码

问题四:

同二,类的函数是放在公共函数区的,所以哪怕不是类对象,也可以成功调用

画了个图,辅助上面的思考: