先熟悉一下最简单的函数指针吧。
函数指针可以在声明的时候赋值
#include <iostream>
using namespace std;
int MyFunc(int i){
return i+1;
}
int (*p1)(int i)=MyFunc; //函数指针的声明
int main()
{
cout << "MyFunc: " <<(*p1)(2)<< endl;
return 0;
}
函数指针也可以先声明,后赋值
#include <iostream>
using namespace std;
int MyFunc(int i){
return i+1;
}
int (*p2)(int i); //也可以先声明后赋值
int main()
{
p2=MyFunc;
cout << "MyFunc: " <<(*p2)(1)<< endl;
return 0;
}
最近项目中用到了类的成员函数的函数指针,还是有一些区别的。
简单的示例如下:
#include <iostream>
#include <cstring>
using namespace std;
class A{
private:
char name[22];
public:
void SetName(char* str){
strcpy(name,str);
}
char *GetName(){return name;}
};
typedef void(A::*p)(char*); //指针名的前面要加上所属类型类名 A::
int main()
{
A a; //先创建出一个对象a
p fun=&A::SetName; //函数指针赋值
(a.*fun)("NameTest");
cout<<a.GetName()<<"名字赋值完成!"<<endl;
return 0;
}
学到这里,我在想那么函数指针能不能支持虚函数呢?
于是去试了下,发现完全是可以的。
#include <tchar.h>
#include <iostream>
#include <stdio.h>
using namespace std;
class A
{
public:
int MyFunc1(int i)
{
printf("A::MyFunc1:i=%d\n",i);
return i+1;
}
virtual int MyFunc2(int i)
{
printf("A::MyFunc2:i=%d\n",i);
return i+2;
}
};
class B:public A
{
public:
virtual int MyFunc2(int i)
{
printf("B::MyFunc2:i=%d\n",i);
return i+3;
}
};
typedef int (A::*p)(int);
int main()
{
A a;
B b;
p fun=&A::MyFunc1;
cout<<(a.*fun)(0)<<endl; //调用普通函数
cout<<(b.*fun)(0)<<endl<<endl;
fun=&A::MyFunc2;
cout<<(a.*fun)(0)<<endl;//调用虚函数
cout<<(b.*fun)(0)<<endl<<endl;
return 0;
}