鱼C论坛

 找回密码
 立即注册
查看: 2657|回复: 0

[技术交流] C重复继承问题的解决->虚继承内存分布。。

[复制链接]
发表于 2012-2-22 16:10:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include "stdafx.h"
  2. #include <iostream.h>

  3. class A
  4. {
  5. public:
  6.     int m_nData1;
  7. public:
  8.     virtual void Fun1()
  9.     {
  10.         
  11.     }
  12.     A()
  13.     {
  14.         m_nData1 =1;
  15.         cout << "A()" << endl;
  16.     }
  17. };

  18. class B:virtual public A
  19. {
  20. public:
  21.     B()
  22.     {
  23.         m_nData2 =2;
  24.         cout << "B()" << endl;
  25.     }
  26.     int m_nData2;
  27. };

  28. class C:virtual public A
  29. {
  30. public:
  31.     C()
  32.     {
  33.         m_nData3 =3;
  34.         cout << "C()" << endl;
  35.     }
  36.     int m_nData3;
  37. };


  38. class D :  public B, virtual public C
  39. {
  40. public:
  41.     virtual void Fun()
  42.     {
  43.         
  44.     }
  45.     D()
  46.     {
  47.         m_nData4 =4;
  48.         cout << "D()" << endl;
  49.     }
  50.     int m_nData4;
  51. };

  52. int main(int argc, char* argv[])
  53. {
  54.     D theD;
  55.     /*
  56.         thed内存分布 = {
  57.             12FF60:thed的vtable指向D::fun(覆盖)
  58.             12FF64:B虚继承于A的一个偏移
  59.             12FF68:B的数据成员 m_ndata2
  60.             12FF6C:D的数据成员 m_ndata4
  61.             12FF70:A的vtable有一个地址为A::fun
  62.             12FF74:A中的数据成员m_ndata1
  63.             12FF78:C虚继承于A的一个偏移与12FF64一样 记录的偏移都能找到A所在的地址
  64.             12FF7C:c的数据成员 m_ndata3

  65.           }
  66.     */
  67.    

  68.     A* lpA = &theD;
  69.     B* lpB = &theD;
  70.     C* lpC = &theD;
  71.     D* lpD = &theD;
  72.     //既然虚继承 都要有个数据记载到父类的偏移 而D又虚继承于C 所以肯定有个数据记录D到C的偏移
  73.     //根据以前学的 12FF60是D对象地址 第一个肯定是Vtable 然后应该是指向记录D到C的偏移的一个地址
  74.     //上面没看到 只有B记录了 实际上下面的验证说明了 和B记录重叠了 只不过是顺序排列到下面了
  75.     //至于上下两个8字节0就像堆申请的fdfdfd....fdfdfd一样 是个标示
  76.     theD.m_nData3 = 5; //这里验证了一下 thed的寻址方法 发现edx+8为D到C的偏移 因为edx+4为B到A的偏移
  77.                        //12FF64确实是指向了一个表 至于表有多少项 则看虚继承了几个类
  78.         return 0;
  79. }
复制代码
今天研究下虚继承 不知道对不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-28 03:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表