多重继承内存布局分析

// VC++ 2005 /Gd // acronym(Root Level) = RL // acronym(Second Level) = SL // acronym(Third Level) = TL #include <stdio.h> typedef void (*VFuncPtr)(); typedef VFuncPtr* VTable; class RL1 { public: virtual void vf_rl1(){} public: int _i_rl1; }; class RL2 { public: int _i_rl2; }; class RL3 { public: virtual void vf_rl3(){} public: int _i_rl3; }; class SL1: public RL1, public RL2, public RL3 { public: int _i_sl1; }; class SL2: public RL1, public RL2, public RL3 { public: virtual void vf_sl2(){} public: int _i_sl2; }; class SL3: public RL2, public RL3 { public: int _i_sl3; }; class SL4: public RL2, public RL3 { public: virtual void vf_sl4(){} public: int _i_sl4; }; // 要分析这个, SL1 和 SL2 采用虚拟继承会好点. 有空再弄. //class TL: // public SL1, public SL2 //{ //public: // virtual void vf_tl(){} //public: // int _i_tl; //}; int main() { RL1 rl1; rl1._i_rl1 = 0x11; int RL1::*pdm_rl1 = NULL; pdm_rl1 = &RL1::_i_rl1; printf("0x%p: 0x%x/n", pdm_rl1, rl1.*pdm_rl1); void (RL1::*pmf_rl1)() = &RL1::vf_rl1; // QuickWatch 标识符 pmf_rl1, 与 thunk 有关. printf("&RL1::vf_rl1: %p/n", pmf_rl1); // 打印的值与虚函数表中的值不一样, WHY? VTable vt_rl1 = *(VTable*)&rl1; // 在 Watch 窗口中看 vt_rl1 下标从 -50 // 到 200 范围内的内容. // 注: 留意 vt_rl1[-1], 与 RTTI 有关. printf("--------------------------------/n"); RL2 rl2; rl2._i_rl2 = 0x22; VTable vt_rl2 = *(VTable*)&rl2; vt_rl2; // printf("--------------------------------/n"); RL3 rl3; rl3._i_rl3 = 0x33; VTable vt_rl3 = *(VTable*)&rl3; vt_rl3; // printf("--------------------------------/n"); SL1 sl1; sl1._i_rl1 = 0x11; sl1._i_rl2 = 0x22; sl1._i_rl3 = 0x33; sl1._i_sl1 = 0x1111; int SL1::*pdm_sl1 = NULL; pdm_sl1 = &SL1::_i_rl1; printf("0x%p: 0x%x/n", pdm_sl1, sl1.*pdm_sl1); pdm_sl1 = &SL1::_i_rl2; printf("0x%p: 0x%x/n", pdm_sl1, sl1.*pdm_sl1); pdm_sl1 = &SL1::_i_rl3; printf("0x%p: 0x%x/n", pdm_sl1, sl1.*pdm_sl1); pdm_sl1 = &SL1::_i_sl1; printf("0x%p: 0x%x/n", pdm_sl1, sl1.*pdm_sl1); // 在 Watch 窗口看: vt_sl1_1, 2 VTable vt_sl1_1 = *(VTable*)&sl1; // 在 Watch 窗口看: vt_sl1_2, 2 VTable vt_sl1_2 = *(VTable*)((char*)&sl1 + sizeof(void*) + sizeof(int)); printf("--------------------------------/n"); SL2 sl2; sl2._i_rl1 = 0x11; sl2._i_rl2 = 0x22; sl2._i_rl3 = 0x33; sl2._i_sl2 = 0x2222; int SL2::*pdm_sl2 = NULL; pdm_sl2 = &SL2::_i_rl1; printf("0x%p: 0x%x/n", pdm_sl2, sl2.*pdm_sl2); pdm_sl2 = &SL2::_i_rl2; printf("0x%p: 0x%x/n", pdm_sl2, sl2.*pdm_sl2); pdm_sl2 = &SL2::_i_rl3; printf("0x%p: 0x%x/n", pdm_sl2, sl2.*pdm_sl2); pdm_sl2 = &SL2::_i_sl2; printf("0x%p: 0x%x/n", pdm_sl2, sl2.*pdm_sl2); // 在 Watch 窗口看: vt_sl2_1, 3 VTable vt_sl2_1 = *(VTable*)&sl2; // 在 Watch 窗口看: vt_sl2_2, 2 VTable vt_sl2_2 = *(VTable*)((char*)&sl2 + sizeof(void*) + sizeof(int)); printf("--------------------------------/n"); SL3 sl3; sl3._i_rl2 = 0x22; sl3._i_rl3 = 0x33; sl3._i_sl3 = 0x3333; int SL3::*pdm_sl3 = NULL; pdm_sl3 = &SL3::_i_rl2; printf("0x%p: 0x%x/n", pdm_sl3, sl3.*pdm_sl3); pdm_sl3 = &SL3::_i_rl3; printf("0x%p: 0x%x/n", pdm_sl3, sl3.*pdm_sl3); pdm_sl3 = &SL3::_i_sl3; printf("0x%p: 0x%x/n", pdm_sl3, sl3.*pdm_sl3); // 在 Watch 窗口看: vt_sl3, 2 VTable vt_sl3 = *(VTable*)&sl3; printf("--------------------------------/n"); SL4 sl4; sl4._i_rl2 = 0x22; sl4._i_rl3 = 0x33; sl4._i_sl4 = 0x4444; int SL4::*pdm_sl4 = NULL; pdm_sl4 = &SL4::_i_rl2; printf("0x%p: 0x%x/n", pdm_sl4, sl4.*pdm_sl4); pdm_sl4 = &SL4::_i_rl3; printf("0x%p: 0x%x/n", pdm_sl4, sl4.*pdm_sl4); pdm_sl4 = &SL4::_i_sl4; printf("0x%p: 0x%x/n", pdm_sl4, sl4.*pdm_sl4); // 在 Watch 窗口看: vt_sl4, 3 VTable vt_sl4 = *(VTable*)&sl4; printf("--------------------------------/n"); return 0; }

0x00000004: 0x11 &RL1::vf_rl1: 0041110E -------------------------------- 0x00000004: 0x11 0x00000010: 0x22 0x0000000C: 0x33 0x00000014: 0x1111 -------------------------------- 0x00000004: 0x11 0x00000010: 0x22 0x0000000C: 0x33 0x00000014: 0x2222 -------------------------------- 0x00000008: 0x22 0x00000004: 0x33 0x0000000C: 0x3333 -------------------------------- 0x00000008: 0x22 0x00000004: 0x33 0x0000000C: 0x4444 --------------------------------

分析结果:
1. SL1 对象

多重继承内存布局分析_第1张图片
2. SL2 对象

多重继承内存布局分析_第2张图片
3. SL3 对象

多重继承内存布局分析_第3张图片
4. SL4 对象

多重继承内存布局分析_第4张图片

你可能感兴趣的:(c,null,Class)