上机_虚函数表内存分布(陈皓的<C++ 虚函数表解析>)

上机_虚函数表内存分布(陈皓的<C++ 虚函数表解析>)
分类: 数据结构|算法 C++语法   988人阅读  评论(0)  收藏  举报

目录(?)[+]

原文章链接是:http://blog.csdn.net/haoel/article/details/1948051

讲的很生动,但是有些小问题,评论里面有些说的非常详细。实验一把

[cpp]  view plain copy
  1. class Base  
  2. {  
  3. public:  
  4.     virtual void f(){cout<<"Base::f()"<<endl;}  
  5.     virtual void g(){cout<<"Base::g()"<<endl;}  
  6.     virtual void h(){cout<<"Base::h()"<<endl;}  
  7. protected:  
  8. private:  
  9. };  
  10. class Base2  
  11. {  
  12. public:  
  13.     virtual void f(){cout<<"Base2::f()"<<endl;}  
  14.     virtual void g(){cout<<"Base2::g()"<<endl;}  
  15.     virtual void h(){cout<<"Base2::h()"<<endl;}  
  16. protected:  
  17. private:  
  18. };  
  19.   
  20. //无覆盖,这样的话,虚函数就在原来的虚函数表后面追加就行了  
  21. class Derived:public Base  
  22. {  
  23. public:  
  24.     virtual void f1(){cout<<"Derived::f1()"<<endl;}  
  25.     virtual void g1(){cout<<"Derived::g1()"<<endl;}  
  26.     virtual void h1(){cout<<"Derived::h1()"<<endl;}  
  27. };  
  28.   
  29. //有覆盖,这样的话相同的函数给覆盖掉  
  30. class Derived_cover:public Base  
  31. {  
  32. public:  
  33.     virtual void f(){cout<<"Derived_cover::f()"<<endl;}  
  34.     virtual void g1(){cout<<"Derived_cover::g1()"<<endl;}  
  35.     virtual void h1(){cout<<"Derived_cover::h1()"<<endl;}  
  36. };  
  37.   
  38. //多重继承,无覆盖  
  39. class multipleDerived:public Base, public Base2  
  40. {  
  41. public:  
  42.     virtual void f1(){cout<<"multipleDerived::f1()"<<endl;}  
  43.     virtual void g1(){cout<<"multipleDerived::g1()"<<endl;}  
  44. };  
  45. //多重继承,有覆盖  
  46. class multipleDerivedCover:public Base, public Base2  
  47. {  
  48. public:  
  49.     virtual void f(){cout<<"multipleDerivedCover::f()"<<endl;}  
  50.     virtual void g1(){cout<<"multipleDerivedCover::g1()"<<endl;}  
  51. };  
  52. typedef void(*fun)(void);  
  53. //测试虚函数与虚函数表的存放关系  
  54. void test1()  
  55. {  
  56.     Base b;  
  57.     fun pfun = NULL;  
  58.     cout<<"虚函数表地址"<<(int*)*(int*)(&b)<<endl;  
  59.     cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&b)<<endl;  
  60.     cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&b)+1)<<endl;  
  61.     cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&b)+2)<<endl;  
  62.     //通过指针直接访问虚函数表里面函数的内容  
  63.     pfun = (fun)(int*)*(int*)*(int*)(&b);  
  64.     pfun();  
  65.     pfun = (fun)(int*)*((int*)*(int*)(&b)+1);  
  66.     pfun();  
  67.     pfun = (fun)(int*)*((int*)*(int*)(&b)+2);  
  68.     pfun();  
  69. }  
  70.   
  71. //测试没有函数覆盖的情况,直接在原来的虚函数表后面追加  
  72. void test2()  
  73. {  
  74.     Base b;  
  75.     Derived derive;  
  76.     fun pfun = NULL;  
  77.     cout<<"虚函数表地址"<<(int*)*(int*)(&b)<<endl;  
  78.     cout<<"虚函数表地址"<<(int*)*(int*)(&derive)<<endl;  
  79.     cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&b)<<endl;  
  80.     cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&derive)<<endl;  
  81.     cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&b)+1)<<endl;  
  82.     cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&derive)+1)<<endl;  
  83.     cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&b)+2)<<endl;       
  84.     cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&derive)+2)<<endl;  
  85.   
  86.     //打印出虚函数内容  
  87.     pfun = (fun)(int*)*(int*)*(int*)(&derive);    
  88.     pfun();  
  89.     pfun = (fun)(int*)*((int*)*(int*)(&derive)+1);  
  90.     pfun();  
  91.     pfun = (fun)(int*)*((int*)*(int*)(&derive)+2);  
  92.     pfun();  
  93.     pfun = (fun)(int*)*((int*)*(int*)(&derive)+3);  
  94.     pfun();  
  95.     pfun = (fun)(int*)*((int*)*(int*)(&derive)+4);  
  96.     pfun();  
  97.     pfun = (fun)(int*)*((int*)*(int*)(&derive)+5);  
  98.     pfun();  
  99.   
  100. }  
  101.   
  102. //有覆盖的情况,直接将原来的函数覆盖掉就行了  
  103. void test3()  
  104. {  
  105.     Base b;  
  106.     Derived_cover derive;  
  107.     fun pfun = NULL;  
  108.     cout<<"虚函数表地址"<<(int*)*(int*)(&b)<<endl;  
  109.     cout<<"虚函数表地址"<<(int*)*(int*)(&derive)<<endl;  
  110.     cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&b)<<endl;  
  111.     cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&derive)<<endl;  
  112.     cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&b)+1)<<endl;  
  113.     cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&derive)+1)<<endl;  
  114.     cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&b)+2)<<endl;       
  115.     cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&derive)+2)<<endl;  
  116.   
  117.     //打印出虚函数内容  
  118.     pfun = (fun)(int*)*(int*)*(int*)(&derive);//f将父类的f覆盖掉  
  119.     pfun();  
  120.     pfun = (fun)(int*)*((int*)*(int*)(&derive)+1);  
  121.     pfun();  
  122.     pfun = (fun)(int*)*((int*)*(int*)(&derive)+2);  
  123.     pfun();  
  124.     pfun = (fun)(int*)*((int*)*(int*)(&derive)+3);//  
  125.     pfun();  
  126.     pfun = (fun)(int*)*((int*)*(int*)(&derive)+4);  
  127.     pfun();  
  128.     cout<<"直接通过父类指针调用子类实现的函数的话"<<endl;  
  129.     Base* newBase = new Derived_cover;  
  130.     newBase->f();  
  131.     newBase->g();  
  132.     newBase->h();  
  133.   
  134. }  
  135.   
  136. //测试多重继承的情况,测试一下多重继承的虚函数表的内存分布,应该是有两个虚函数表,  
  137. //分别指向base,base2,无覆盖  
  138. void test4()  
  139. {  
  140.     cout<<"多重继承的内存分布"<<endl;  
  141.     multipleDerived myMultiple;  
  142.     fun pfun = NULL;  
  143.     cout<<"多重继承的虚函数1地址"<<(int*)*(int*)(&myMultiple)<<endl;  
  144.     cout<<"多重继承的虚函数2地址"<<(int*)*((int*)(&myMultiple)+1)<<endl;  
  145.     cout<<"虚函数表1应该是Base函数+子类未被覆盖的函数"<<endl;  
  146.     pfun = (fun)(int*)*(int*)*(int*)(&myMultiple);//vp1的fun1 base::f()  
  147.     pfun();  
  148.     pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+1);//vp1的fun2 base::g()  
  149.     pfun();  
  150.     pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+2);//vp1的fun3 base::h()  
  151.     pfun();  
  152.     pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+3);//vp1的fun4 multipleDerived::f1()  
  153.     pfun();  
  154.     pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+4);//vp1的fun4 multipleDerived::g1()  
  155.     pfun();  
  156.     cout<<"虚函数表2"<<endl;  
  157.     pfun = (fun)(int*)*(int*)*((int*)(&myMultiple)+1);  
  158.     pfun();  
  159.     pfun = (fun)(int*)*((int*)*((int*)(&myMultiple)+1)+1);  
  160.     pfun();  
  161.   
  162. }  
  163.   
  164. //测试多重继承有覆盖  
  165. void test5()  
  166. {  
  167.     cout<<"多重继承有覆盖"<<endl;  
  168.     multipleDerivedCover d;  
  169.     Base* d1 = &d;  
  170.     Base2* d2 = &d;  
  171.     d1->f();  
  172.     d2->f();  
  173.   
  174.     d1->g();  
  175.     d2->g();  
  176. }  
  177.   
  178. int main()  
  179. {  
  180.   
  181.     test1();  
  182.     test2();  
  183.     test3();  
  184.     test4();  
  185.     test5();  
  186.     return 0;  
  187. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值