首页 > 代码库 > 虚函数表
虚函数表
问
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 }
答
先参考: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没有这个数据,于是访问未知地址,得到乱码
问题四:
同二,类的函数是放在公共函数区的,所以哪怕不是类对象,也可以成功调用
画了个图,辅助上面的思考:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。