深度探索c++对象模型-25-指向成员函数的指针和vcall

本文探讨了如何使用成员函数指针调用类的普通成员函数,强调了普通成员函数依赖`this`指针并通过对象调用。同时,重点比较了如何调用静态成员函数,指出静态成员函数无需`this`,可以直接通过函数指针访问。最后,深入解析了虚函数指针的调用行为,揭示其在多态中的调用机制.

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、指向成员函数的指针

class A
{
public:
	
	void myfunc1(int nTempValue)
	{
		cout << "nTempValue = " << nTempValue << endl;
	}
	void myfunc2(int nTempValue2)
	{
		cout << "nTempValue2 = " << nTempValue2 << endl;
	}


};

void func()
{
	A mya;
	void(A::*pMypoint)(int n) = &A::myfunc1;
	//通过成员函数指针来调用成员函数,必须要通过对象的介入才能调用
	(mya.*pMypoint)(100);

	//用对象的指针来调用成员函数指针
	A *pMya = new A;
	(pMya->*pMypoint)(1000);
	/*
	编译器视角:
	pMypoint(pMya,1000)
	*/
}
void main()
{
	
	func(); 
	system("pause");
}

结果:
在这里插入图片描述
类中的成员函数都是在编译的时候就确定好的,但是在调用的时候是需要通过对象来调用成员函数的,因为成员函数的运行依赖于一个this指针,这个this指针其实就是对象的首地址。其实所有这种常规的(非静态)的成员函数,要想调用,都需要一个对象来调用它。

接下来往类中增加一个静态成员函数,

class A
{
public:
	
	void myfunc1(int nTempValue)
	{
		cout << "nTempValue = " << nTempValue << endl;
	}
	void myfunc2(int nTempValue2)
	{
		cout << "nTempValue2 = " << nTempValue2 << endl;
	}

	static void mySfunc(int nsTempvalue)
	{
		cout << "A:mySfucn() 静态成员函数:" << nsTempvalue << endl;
	}

};

void func()
{
	A mya;
	void(A::*pMypoint)(int n) = &A::myfunc1;
	//通过成员函数指针来调用成员函数,必须要通过对象的介入才能调用
	(mya.*pMypoint)(100);

	//用对象的指针来调用成员函数指针
	A *pMya = new A;
	(pMya->*pMypoint)(1000);
	/*
	编译器视角:
	pMypoint(pMya,1000)
	*/

	//静态
	void(*pfuncs)(int a) = &A::mySfunc;
	pfuncs(101);
}

结果:
在这里插入图片描述
因为静态成员函数是跟着类走的,编译器不会向静态成员函数中插入this指针作为第一个参数。所以可以使用函数指针调用静态成员函数。

二、指向虚成员函数的指针

向类中加入如下函数

virtual void myvirfunc(int ntempvalue)
{
	cout << "myvirfunc是虚函数,ntempvalue = " << ntempvalue << endl;
}

使用成员函数指针来接虚函数。因为虚函数的执行需要this指针
调用:
//用对象的指针来调用成员函数指针

A *pMya = new A;
(pMya->*pMypoint)(1000);

void(A::*pmyvirfu)(int nn) = &A::myvirfunc;
(pMya->*pmyvirfu)(10086);

在这里插入图片描述
那通过成员函数指针接过来的虚函数走的是普通函数的调用,还是走的虚函数表的调用呢?
其实是走的虚函数表(多态的调用方式)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值