C++对象内存布局--⑤GCC编译器--单个虚拟继承
测试GNU的GCC编译器在处理虚拟继承上跟VS不同的地方。派生类的虚函数表跟虚基类表合并。
//GCC编译器--单个虚拟继承.cpp //2010.8.18 //虚基类表到底是那个?,还是说派生类的虚函数表的上边和下边都是? //GCC编译器 #include <iostream> using namespace std; ////////////////////////////////////////////////////////////////// class Base { public: Base(int a = 10):a(a) { cout << "Base::Base()" << endl; } virtual void show1() { cout << "Base::show1()" << endl; cout << a << endl; } private: int a; }; ////////////////////////////////////////////////////////////////// class Derived : virtual public Base { public: Derived(int b = 100):b(b) { cout << "Derived::derived()" << endl; } virtual void show2() { cout << "Derived::show2()" << endl; cout << b << endl; } private: int b; }; ////////////////////////////////////////////////////////////////// int main() { Derived obj; int** p = (int**)&obj; cout << "虚拟继承了基类的派生类的对象内存布局:" <<endl; for (int i = 0; i != sizeof(obj)/4; ++i) { cout << p[i] << endl; } typedef void (*fun)(void*pThis);//this指针非常重要 cout << endl << "第一虚函数表第一项,虚函数Derived::show2()地址:" << (int*)p[0][0] << endl; ((fun)(p[0][0]))(p); cout << "第二虚函数表第一项,虚函数Base::show1()地址 :" << (int*)p[2][0] << endl; ((fun)(p[2][0]))(p+2); cout << endl << "派生类虚函数表指针往低地址方向寻址:" << endl; cout << "p[0][-1] = " << (int*)p[0][-1] << endl; cout << "p[0][-2] = " << (int*)p[0][-2] << endl; cout << "p[0][-3] = " << (int*)p[0][-3] << endl; cout << endl << "派生类虚函数表指针往高地址方向寻址:" << endl; cout << "p[0][0] = " << (int*)p[0][0] << "(这个是show2()函数地址)" << endl; cout << "p[0][1] = " << (int*)p[0][1] << endl; cout << "p[0][2] = " << (int*)p[0][2] << endl; cout << "p[0][3] = " << (int*)p[0][3] << endl; cout << endl << "是否往高方向寻找和往地方向寻找所找到的都是虚基类表呢?" << endl; //system("pause"); return 0; } /* Base::Base() Derived::derived() 虚拟继承了基类的派生类的对象内存布局: 0x472d4c 0x64 0x472d5c 0xa 第一虚函数表第一项,虚函数Derived::show2()地址:0x41cd50 Derived::show2() 100 第二虚函数表第一项,虚函数Base::show1()地址 :0x41ccbc Base::show1() 10 派生类虚函数表指针往低地址方向寻址: p[0][-1] = 0x471388 p[0][-2] = 0 p[0][-3] = 0x8 派生类虚函数表指针往高地址方向寻址: p[0][0] = 0x41cd50(这个是show2()函数地址) p[0][1] = 0 p[0][2] = 0xfffffff8 p[0][3] = 0x471388 是否往高方向寻找和往地方向寻找所找到的都是虚基类表呢? */