虚函数以及c++成员函数的调用原理

class base11
{
public:
	base11()
	{
		m_i=0;
	}
	virtual int get()
	{
		return m_i;
	}
public:
	int m_i;
};
class subclass : public base11
{
public:
	subclass()
	{
		m_j=1;
	}
	virtual int get()
	{
		printf("hello,%d\n",m_j);
		return 0;
	}
public:
	int m_j;
};
int main()
{
	base11* p = 0;
	subclass q;
	p = &q;
	int (*fun)(base11*) = NULL;//c++成员函数的调用,编译器底层会再传入一个对象的指针,也就是能在成员函数中使用的this指针,所以这里传入对象指针;但是也可以不传入对象的指针,由编译器自动添加对象的指针,所以还可以这样写(下段程序):

	fun = (int(*)(base11*))((*(unsigned int**)&q)[0]);//
	fun(p);
}


base11* p = 0;
	subclass q;
	p = &q;
	int (*fun)() = NULL;
	fun = (int(*)())((*(unsigned int**)&q)[0]);//unsigned int ** 将&q变成了指向一个数组的指针,并且这个数组的元素还是指针;*(unsigned int**)&q,的作用是取这个数组的第一个元素,取出来还是地址,也可以认为是一个指针,指向了虚函数表,同时虚函数表也是一个数组,((*(unsigned int**)&q)[0]虚函数表中的第一个元素,这个元素同样是个指针,指向了成员函数的地址

	fun();



转自:http://blog.csdn.net/pennyliang/article/details/7648313




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值