C++对象内存布局--⑧GCC编译器--虚拟继承多个基类
2010-08-20 01:17
591 查看
C++对象内存布局--⑧GCC编译器--虚拟继承多个基类
//GCC编译器--虚拟继承多个基类.cpp //2010.8.18 //跟VS的编译器相比,GCC编译器的派生类对象大小就小了很多。 //虚基类表指针合并了,“间隔”也没有了。 //通过另外的测试发现,派生类重写了虚基类的虚函数,但是派生类的虚函数表中有被重写了的虚函数的地址, //这一点跟VS的编译器不同,可能是因为这样才不需要“间隔”。 //GCC编译器 #include <iostream> using namespace std; //////////////////////////////////////////////////// class BaseA { public: BaseA(int a = 10):a(a) { } virtual void f() { cout << "BaseA::f()" << "\t" << a << endl; } int a; }; //////////////////////////////////////////////////// class BaseB { public : BaseB(int b = 20):b(b) { } virtual void f() { cout << "BaseB::f()" << "\t" << b << endl; } int b; }; //////////////////////////////////////////////////// class Derived :virtual public BaseA, virtual public BaseB { public: Derived(int c = 100):c(c) { } void f() { cout << "Derived::f()" << "\t" << c << endl; } virtual void ff() { cout << "Derived::ff()" << "\t" << c << endl; } int c; }; //////////////////////////////////////////////////// int main() { Derived obj; int** p = (int**)&obj; cout << "sizeof = " << sizeof(obj) << endl; for (int i = 0; i != sizeof(obj)/4; ++i) { cout << p[i] << endl; } typedef void (*fun)(void*pThis);//非常重要 /*通过虚函数表调用函数*/ ((fun)(p[0][0]))(p); ((fun)(p[0][1]))(p); ((fun)(p[2][0]))(p+2); ((fun)(p[4][0]))(p+4); cout << "证实输出相同的那些函数调用,来自不同的虚函数表表项" << endl; cout << &(p[0][0]) << endl; cout << &(p[2][0]) << endl; cout << &(p[4][0]) << endl; //system("pause"); return 0; } /* sizeof = 24 0x472c50 0x64 0x472c64 0xa 0x472c74 0x14 Derived::f() 100 Derived::ff() 100 Derived::f() 100 Derived::f() 100 证实输出相同的那些函数调用,来自不同的虚函数表表项 0x472c50 0x472c64 0x472c74 */
相关文章推荐
- C++对象内存布局--⑦VS编译器--虚拟继承多个基类
- C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承
- C++对象内存布局--⑥GCC编译器-虚拟继承的虚基类表可能有两个
- C++对象内存布局--⑨VS编译器--虚拟继承--菱形继承
- C++对象内存布局--⑥GCC编译器-虚拟继承的虚基类表可能有两个
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局 - 问笑
- C++对象内存布局--⑤GCC编译器--单个虚拟继承
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局
- C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承
- C++ 对象的内存布局(多重虚拟继承)
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局
- C++对象的内存布局---单继承
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析
- c++虚继承对象的内存布局
- 不同编译器下虚继承层次的对象的内存布局 8, 20, 32
- C++对象内存布局--②测试派生类跟基类的虚函数表
- c++虚继承对象的内存布局(修改版)
- 关于C++对象继承中的内存布局示例详解
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局
- C++虚拟继承__对象内存的分布_虚继承会多余分配虚表v-tab的指