|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include "stdafx.h"
- #include <iostream.h>
- class A
- {
- public:
- int m_nData1;
- public:
- virtual void Fun1()
- {
-
- }
- A()
- {
- m_nData1 =1;
- cout << "A()" << endl;
- }
- };
- class B:virtual public A
- {
- public:
- B()
- {
- m_nData2 =2;
- cout << "B()" << endl;
- }
- int m_nData2;
- };
- class C:virtual public A
- {
- public:
- C()
- {
- m_nData3 =3;
- cout << "C()" << endl;
- }
- int m_nData3;
- };
- class D : public B, virtual public C
- {
- public:
- virtual void Fun()
- {
-
- }
- D()
- {
- m_nData4 =4;
- cout << "D()" << endl;
- }
- int m_nData4;
- };
- int main(int argc, char* argv[])
- {
- D theD;
- /*
- thed内存分布 = {
- 12FF60:thed的vtable指向D::fun(覆盖)
- 12FF64:B虚继承于A的一个偏移
- 12FF68:B的数据成员 m_ndata2
- 12FF6C:D的数据成员 m_ndata4
- 12FF70:A的vtable有一个地址为A::fun
- 12FF74:A中的数据成员m_ndata1
- 12FF78:C虚继承于A的一个偏移与12FF64一样 记录的偏移都能找到A所在的地址
- 12FF7C:c的数据成员 m_ndata3
- }
- */
-
- A* lpA = &theD;
- B* lpB = &theD;
- C* lpC = &theD;
- D* lpD = &theD;
- //既然虚继承 都要有个数据记载到父类的偏移 而D又虚继承于C 所以肯定有个数据记录D到C的偏移
- //根据以前学的 12FF60是D对象地址 第一个肯定是Vtable 然后应该是指向记录D到C的偏移的一个地址
- //上面没看到 只有B记录了 实际上下面的验证说明了 和B记录重叠了 只不过是顺序排列到下面了
- //至于上下两个8字节0就像堆申请的fdfdfd....fdfdfd一样 是个标示
- theD.m_nData3 = 5; //这里验证了一下 thed的寻址方法 发现edx+8为D到C的偏移 因为edx+4为B到A的偏移
- //12FF64确实是指向了一个表 至于表有多少项 则看虚继承了几个类
- return 0;
- }
复制代码 今天研究下虚继承 不知道对不对 |
|