C++中的虚函数

虚函数的实现
简单的讲,当定义一个虚函数后,类里面会有一个__vptr指针,指向vtbl(虚函数表),虚函数表里面存放了其对应的虚函数的地址

所有当没有其它数据成员时,用sizeof取其大小,其大小为4

class A
{
public:
	virtual void Fun(){
		printf("A::Fun()\n");
	};
	virtual void Fun2()
	{
		printf("A::Fun2()\n");
	}

};

class B:public A
{
public:
	void Fun(){
		printf("B::Fun()\n");
	}
	void Fun2(){
		printf("B::Fun2()\n");
	}
};
如果想手动调用虚函数,可以这样做,先得到vptr,跟据vptr找到vtbl...
如上例,没有其它数据成员的情况下
//把vptr的值放到lVptrAddr,这个值也就是vtbl的地址
long lVptrAddr;
memcpy(&lVptrAddr , p , 4);
//然后根据vtbl得到相应的虚函数地址
void (*fun)(A*);//函数指针,这里参数为类指针,调用类成员函数是,会有一个this指针,这里的A*就是那个this指针
memcpy(&fun,(long*)lVptrAddr,4);

int main()
{
	A a;
	B b;
	A *p = &b;
	long lVptrAddr;
	memcpy(&lVptrAddr , p , 4);
	void (*fun)(A*);
	memcpy(&fun,(long*)lVptrAddr,4);
	fun(p);
	return 0;
}

//更通用的代码
void CallVirtualFun(void *pThis,int index = 0)
{
	void (*funptr)(void *);
	long lVptrAddr = 0;
	memcpy(&lVptrAddr , pThis , 4);
	memcpy(&funptr,((long*)lVptrAddr) + index , 4);
	funptr(pThis);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值