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 */ |