class A
{
public:
static void staticmember(){cout<<"static"<
void nonstatic(){cout<<"nonstatic"<
virtual void virtualmember(){cout<<"virtual"<
};
int main()
{
A a;
//static成员函数,取得的是该函数在内存中的实际地址,而且因为static成员是全局的,所以不能用A::限定符
void (*ptrstatic)() = &A::staticmember;
//nonstatic成员函数 取得的是该函数在内存中的实际地址
void (A::*ptrnonstatic)() = &A::nonstatic;
//虚函数取得的是虚函数表中的偏移值,这样可以保证能过指针调用时同样的多态效果
void (A::*ptrvirtual)() = &A::virtualmember;
//函数指针的使用方式
ptrstatic();
(a.*ptrnonstatic)();
(a.*ptrvirtual)();
}
.
可以在bfunc中加一个传入参数A *a;然后调用你想要的a->afunc。而不必操作指针。
如
A中:
b.bfunc(this);
B中:
bfunc(A*a){
a->afunc();
}
建议尽量不用这样的操作,这说明类的设计有点问题,可能会出现死循环A->B->A->B.....
而且看起来还是像在用c的思想写c++程序。
非静态的成员函数需要访问类内的非静态成员,a.fun()访问的a的成员,b.fun()访问的是b的
所以编译器会在背后传递一个this指针,指向调用非静态成员函数的对象,这样函数内就可以通过this指针访问非静态成员,而静态成员是全部对象共享的,不需要this指针
用C语言表示就类似这样:
struct A{int a;};
void A_set(struct A *this,int m) // void A::set(int m)
{
this->a=m;
}
int main(){
struct A one,two;
A_set(&one,5); //one.set(5)
A_set(&two,2); //two.set(2)
}
所以定义成员函数指针就需要类的类型和对象
class A{
public: void a(int m){}
void b(int m){}
};
int main(){
A one,two;
one.a(1);
void (A::*p)(int m); // 用 ::* 指定为 A类void(*)(int m)类型成员函数 的指针
p=&A::b; // 绑定 A类的 b 成员函数,不要忘掉加 &
(two.*p)(2); // 用two对象调用成员函数指针, 对象指针用 ->* : ( (&two) ->* p)(2)
}
注意要加括号,参数列表的括号的优先级要高
重新定向指针啊