C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承
//GCC编译器--虚拟继承--菱形继承.cpp //2010.8.19 //GCC编译器 #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 内存布局:" << endl; for (int i = 0; i != sizeof(obj)/4; ++i) { cout << p[i] << endl; } cout << endl; typedef void (*fun)(void*pThis);//非常重要 /*通过虚函数表调用函数*/ /*第一个虚函数表指针。BaseA*/ ((fun)(p[0][0]))(p); ((fun)(p[0][1]))(p);//头两个是BaseA的 ((fun)(p[0][2]))(p); ((fun)(p[0][3]))(p);//后两个是Derived的 /*第二个虚函数表指针。BaseB*/ cout << endl; ((fun)(p[2][0]))(p+2); /*第三个虚函数表指针。Base*/ cout << endl; ((fun)(p[5][0]))(p+5); ((fun)(p[5][1]))(p+5); return 0; } /* Derived obj 内存布局: 0x472d0c 0x14 0x472d28 0x1e 0x28 0x472d3c 0xa BaseA::showA() 20 BaseA::testA() 20 Derived::show() 40 Derived::test() 40 BaseB::showB() 30 Derived::show() 40 BaseA::testA() 20 */