C++对象内存布局--⑨VS编译器--虚拟继承--菱形继承
2010-08-20 01:20
856 查看
C++对象内存布局--⑨VS编译器--虚拟继承--菱形继承
//VS编译器--虚拟继承--菱形继承.cpp //2010.8.19 //VS编译器 #include <iostream> using namespace std; //////////////////////////////////////////////////////////////// class Base { public: Base(int a = 10):a(a) { } virtual void show() { cout << "Base::show()" << "\t" << a << endl; } virtual void testA() { cout << "Base::testA()" <<"\t" << a << endl; } private: int a; }; //////////////////////////////////////////////////////////////// class BaseA : virtual public Base { public: BaseA(int b = 20):b(b) { } virtual void showA() { cout << "BaseA::showA()" << "\t" << b << endl; } void testA() { cout << "BaseA::testA()" << "\t" << b << endl; } private: int b; }; //////////////////////////////////////////////////////////////// class BaseB : virtual public Base { public: BaseB(int c = 30):c(c) { } virtual void showB() { cout << "BaseB::showB()" << "\t" << c << endl; } private: int c; }; //////////////////////////////////////////////////////////////// class Derived : public BaseA, public BaseB { public: Derived(int d = 40):d(d) { } virtual void show() { cout << "Derived::show()" << "\t" << d << endl; } virtual void test() { cout << "Derived::test()" << "\t" << d << endl; } private: int d; }; //////////////////////////////////////////////////////////////// int main() { Derived obj; int** p = (int**)&obj; cout << "Derived obj sizeof = " << sizeof(obj) << endl; cout << "Derived obj 内存布局:" << endl; for (int i = 0; i != sizeof(obj)/4; ++i) { cout << p[i] << endl; } cout << endl; typedef void (__thiscall *fun)(void*pThis);//非常重要 /*通过虚函数表调用函数 第一个虚函数表指针。BaseA*/ ((fun)(p[0][0]))(p); ((fun)(p[0][1]))(p); //第二个虚函数表指针。BaseB cout << endl; ((fun)(p[3][0]))(p+3); //第三个虚函数表指针。Base cout << endl; ((fun)(p[8][0]))(p+8); ((fun)(p[8][1]))(p+8); system("pause"); return 0; } /* Derived obj sizeof = 40 Derived obj 内存布局: 0041A200 0041A210 00000014 0041A1F8 0041A208 0000001E 00000028 00000000 0041A1EC 0000000A BaseA::showA() 20 Derived::test() 40 BaseB::showB() 30 Derived::show() 40 BaseA::testA() 20 */
相关文章推荐
- C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承
- C++对象内存布局--⑦VS编译器--虚拟继承多个基类
- C++对象内存布局--⑧GCC编译器--虚拟继承多个基类
- C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承
- C++对象内存布局--④VS编译器--单个虚拟继承
- C++ 对象的内存布局(多重虚拟继承)
- 【C++】菱形虚拟继承(内存布局)
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局 - 问笑
- c++虚继承对象的内存布局
- C++ 多重继承和虚拟继承的内存布局(vtable,vptr)
- 虚继承内存布局@c++对象模型
- C++对象内存布局-单一继承
- C++对象内存布局-多重继承
- C++对象的内存布局---单继承
- c++虚继承对象的内存布局
- C++对象内存布局:单继承,多继承,虚继承
- c++虚继承对象的内存布局(修改版)
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- C++ — 关于菱形虚拟继承对象模型的探究
- C++ 对象的内存布局—— 虚继承下的虚函数