含有虚函数类的对象在内存中的结构

含有虚函数或基类含有虚函数的类,通过基类指针指向其对象,用指针调用虚函数时,调用的是指针指向对象类中的虚函数,通过引用也是这样。

这样的对象,在内存中的结构是什么样子的?先定义一个类:

class Base{
	public:
	Base():a(10),b(20),c(30){}
	virtual void fun1()
	{
		cout<<"This is virtual fun1"<<endl;
	}
	virtual void fun2()
	{
		cout<<"This is virtual fun2"<<endl;
	}
	int a;
	int b;
	int c;
};
在32位机上,通过sizeof可以得到其对象占用内存16个字节。
三个int变量a,b,c各占4个字节,还有一个虚函数表指针,它也占用4个字节。
虚函数表指针在对象的首部,它指向虚函数表。在虚函数表中,存放着虚函数的地址。当通过指针或引用调用虚函数时,首先找到虚函数表指针(在对象首部),通过虚函数表指针找到虚函数表,在虚函数表中找到对应虚函数的地址,之后再调用虚函数。显然这样调用虚函数要两次通过指针来查找地址,这也就是多态带来的开支。

可以通过代码测试一下:

#include<iostream>
using namespace std;
class Base{
	public:
	Base():a(10),b(20),c(30){}
	virtual void fun1()
	{
		cout<<"This is virtual fun1"<<endl;
	}
	virtual void fun2()
	{
		cout<<"This is virtual fun2"<<endl;
	}
	int a;
	int b;
	int c;
};
int main()
{
	Base B;
	int **p=(int **)&B;
	cout<<"对象所占内存大小:"<<sizeof(B)<<endl; 
	cout<<"虚函数指针的地址"<<&p[0]<<"虚函数表地址:"<<p[0]<<endl;
	cout<<"第一个变量的地址"<<&p[1]<<"第一个变量的值:"<<p[1]<<endl;
	cout<<"第二个变量的地址"<<&p[2]<<"第二个变量的值:"<<p[2]<<endl;
	cout<<"第三个变量的地址"<<&p[3]<<"第三个变量的值:"<<p[3]<<endl;
	cout<<"虚函数fun1地址:"<<hex<<p[0][0]<<endl;
	cout<<"虚函数fun2地址:"<<hex<<p[0][1]<<endl;
	typedef void(*fun1)();//指向函数的指针 
	//通过函数指针调用函数 
	cout<<"通过指针调用虚函数"<<endl;
	((fun1)p[0][0])();
	((fun1)p[0][1])(); 
	return 0;
}

 输出为:

对象所占内存大小:16
虚函数指针的地址0x22ff30虚函数表地址:0x4450a8
第一个变量的地址0x22ff34第一个变量的值:0xa
第二个变量的地址0x22ff38第二个变量的值:0x14
第三个变量的地址0x22ff3c第三个变量的值:0x1e
虚函数fun1地址:4154f4
虚函数fun2地址:415520
通过指针调用虚函数
This is virtual fun1
This is virtual fun2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值