类函数指针和普通函数指针

我们都看惯了一般的函数指针,但是关于类的函数指针又是怎样的呢?它的静态函数指针和非静态函数指针是一样的么?


#include<iostream>
using namespace std;


typedef int(*pMax)(int,int);//普通函数指针


int max(int a,int b)
{
	return a>b?a:b;
}


class A
{
public:
	int min(int a,int b)
	{
		return a<b?a:b;
	}


	static int myMin(int a,int b)
	{
		return a<b?a:b;
	}
};


class B:public A
{


};
typedef int (A::*pMin)(int,int);//类的非静态函数指针
typedef int (*pMyMin)(int,int);//类的静态函数指针


typedef int (B::*pMinB)(int,int);//类的非静态函数指针


void main()
{
	int a=3;
	int b=4;
	
	cout<<max(a,b)<<endl;
	/*    测试普通函数指针    */
	pMax p1=&max;
	cout<<(*p1)(a,b)<<endl;


	int (*p2)(int, int)=&max;
	cout<<(*p2)(a,b)<<endl;


	/*    测试类的非静态函数指针    */
	A TestA;
	pMin p3=&A::min;
	cout<<(TestA.*p3)(a,b)<<endl;


	int(A::*p4)(int,int)=&A::min;
	cout<<(TestA.*p4)(a,b)<<endl;
	


	/*    测试类的静态函数指针    */
	pMyMin p5=&A::myMin;
	cout<<(*p5)(a,b)<<endl;


	int(*p6)(int,int)=&A::myMin;
	cout<<(*p6)(a,b)<<endl;




	/*    测试非静态函数指针在类继承中怎么使用    */
	B TestB;
	pMinB p7=&A::min;


	cout<<(TestB.*p7)(a,b)<<endl;
	cout<<(TestB.*p3)(a,b)<<endl;
//	cout<<(TestA.*p7)(a,b)<<endl;错误
}

从中可以看出,父类对象不可以调用以子类声明的函数指针,而子类对象可以调用以父类声明的函数指针



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
成员函数指针普通函数指针是有区别的,因为成员函数需要有一个隐含的this指针。因此,如果要将成员函数指针转换为普通函数指针,就需要用到一些技巧。 具体的实现方法是:将成员函数指针与对象的地址绑定起来,然后再将其转换为普通函数指针。这样,当调用普通函数指针时,就会自动将对象的地址传递给它。 下面是一个示例代码,演示了如何将成员函数指针转换为普通函数指针: ``` #include <iostream> using namespace std; class MyClass { public: void print(int x) { cout << "x = " << x << endl; } }; void call_print(int x) { MyClass obj; void (MyClass::*func_ptr)(int) = &MyClass::print; (obj.*func_ptr)(x); } int main() { void (*p)(int) = call_print; (*p)(10); return 0; } ``` 在上述示例代码中,我们定义了一个名为call_print的函数,它接受一个int型的参数,并将它传递给MyClass的print函数。在call_print函数中,我们首先创建了MyClass的一个对象obj,然后定义了一个名为func_ptr的成员函数指针,它指向MyClass的print函数。最后,我们通过(obj.*func_ptr)(x)的方式来调用MyClass的print函数。 接下来,在main函数中,我们定义了一个名为p的普通函数指针,它指向call_print函数。然后,我们通过(*p)(10)的方式来调用call_print函数,并将10作为参数传递给它。这样,就实现了将成员函数指针转换为普通函数指针的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值