菱形继承与虚拟菱形继承对象模型
2017-02-17 16:12
495 查看
菱形继承对象模型
下面用一段菱形继承的代码来探究菱形继承的对象模型class AA { public: virtual void fun1() { cout << "AA::fun1()" << endl; } public: int _a; }; class BB : public AA { public: virtual void fun1() { cout << "BB::fun1()" << endl; } public: int _b; }; class CC : public AA { public: virtual void fun1() { cout << "CC::fun1()" << endl; } public: int _c; }; class DD :public BB,public CC { public: virtual void fun1() { cout << "DD::fun1()" << endl; } virtual void fun2() { cout << "DD::fun2()" << endl; } public: int _d; }; void Test1() { DD d; d.BB::_a = 1; d.CC::_a = 2; d._b = 3; d._c = 4; d._d = 5; }
打开内存窗口,进行单步调试,结果如下:
对于对象d,重写了fun1(),所以将DD的fun1()放入虚表,再将fun2()放入虚表,图片中另一个虚表指针指向的是CC中的虚函数,CC中的fun1()重写了AA中的fun1(),所以在虚表中放入CC的fun1()。这一这样理解,橙色区域本来应给是AA类,续表中存储的是AA::fun1()的地址,但是BB类中从写了fun1(),所以把AA::fun1()替换为了CC::fun1()。所以,对于一个类中的虚函数,若是重写的父类的,则将虚表中的函数地址替换为自己的虚函数地址,若不是重写的函数,则直接将该函数地址放入虚表中。
菱形虚拟继承对象模型
现在把上面的代码改为虚拟继承,再来看内存窗口中的结果:下面提供完整的代码调用虚函数
class AA { public: virtual void fun1() { cout << "AA::fun1()" << endl; } public: int _a; }; class BB : virtual public AA { public: virtual void fun1() { cout << "BB::fun1()" << endl; } public: int _b; }; class CC : virtual public AA { public: virtual void fun1() { cout << "CC::fun1()" << endl; } public: int _c; }; class DD :public BB,public CC { public: virtual void fun1() { cout << "DD::fun1()" << endl; } virtual void fun2() { cout << "DD::fun2()" << endl; } public: int _d; }; typedef void(*FUNC) (); void PrintfVTable(int *VTable) { cout << "虚表地址:" << "0x" << VTable << endl; for (int i = 0; VTable[i] != 0; ++i) { cout << "虚函数地址:0x" << VTable[i] << " "; FUNC f = (FUNC)VTable[i]; f(); } cout << endl; } void Test1() { DD d; d.BB::_a = 1; d.CC::_a = 2; d._b = 3; d._c = 4; d._d = 5; int* VTable = (int *)(*(int *)&d); PrintfVTable(VTable); VTable = (int *)(*((int*)&d + 6)); PrintfVTable(VTable); }
相关文章推荐
- c++多态对象模型:菱形继承和菱形虚拟继承
- 【C++】菱形虚拟继承对象模型分析
- C++ — 关于菱形虚拟继承对象模型的探究
- C++ 多重继承和虚拟继承对象模型、效率分析
- C++多重继承和虚拟继承对象模型、效率分析
- C++中多态与对象模型及菱形继承
- 【c++】菱形虚拟虚拟继承模型探索
- C++对象内存布局--⑨VS编译器--虚拟继承--菱形继承
- 派生类对象模型之菱形继承派生类对象模型
- C++虚拟多重继承对象模型讨论
- c++对象模型之菱形继承
- 探究菱形继承对象模型
- C++多重继承和虚拟继承对象模型、效率分析
- C++ - 多重继承和虚拟继承对象模型、效率分析
- C++多重继承和虚拟继承对象模型、效率分析
- Microsoft Visual C++虚拟多继承 对象模型初步分析
- 菱形继承和虚继承、对象模型和虚基表
- 探索多态模型—菱形继承和菱形虚拟继承
- C++虚拟继承中的对象模型
- C++虚拟多重继承对象模型讨论