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

posted on 2010-08-20 01:17  烛秋  阅读(626)  评论(2编辑  收藏  举报