C++函数指针

2014-11-24 10:36:41 · 作者: · 浏览: 0

今天看了一下C++函数指针


一般的C函数指针,由于没有域说明,用起来还是比较方便


但是C++有域说明了之后,就会发现各种限制接二连三,不过虽然一点也不安全,还是实现了,废话说多了,看题。


我最开始的想法是A是父类,B:public A。B有两个实例b1,b2。如果b1想用b2的函数,如何使用函数指针实现?


class A


{


public:


typedef void (A::*pFuncA)(string str);


pFuncA fun;


};




class B: public A


{


public:


B(string b)


{ my= b; }




/*补充1*/


typedef void (B::*pFuncB)(string);


/*end*/




void Register(pFunc _fun)


{


fun= _fun;


};



void TestFun(string str)


{


cout<

}


private:


string my;


};




void main()


{


B b1("b1");


B b2("b2");


b2.Register(...);


}


b2的Register传b1的函数就可以了,结果发现我太天真了,没有办法传b1的函数,不让调用~~“.”只能调用成员,函数名有不是成员


没有办法,只能退而求其次,使用&B::TestFun,发现还是不行,因为类型为pFunc,是A类的函数指针,TestFun是B类的函数,不能转


好吧,没有办法,在定义一个B::*的类型pFuncB



void main()


{


B b1("b1");


B b2("b2");



B::pFuncB pb= &B::TestFun;


int* ptemp= (int*)&pb;


A::pFuncA pa= *(A::pFuncA*)ptemp;


b2.Register(pa);


}


好吧,绕了一大圈,终于把函数传进去了,但是你会发现——这是谁的函数?答案是——你用b2调,调用的是b2的,你用b1调,调的是b1的。原因,很简单,应为代码域是共享的~~


好吧,然后就是如何调用,如果你觉得是b1.fun("函数调用");那就大错特错了~~


调用方式:


(b1.*(b2.fun))("函数调用");


OK完成了~~强烈感觉~~C++的类型转换是一个让人极爱并且极恨的——东西~~(吐槽完)