C++对象内存布局--⑧GCC编译器--虚拟继承多个基类

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值