#include <stdio.h>
class A
{
public:
virtual ~A(){}
};
class B : public A
{
public:
void Func(void){ printf( "B Func();\n" ); }
};
typedef void(A::*A_Callback)(void);
class C
{
public:
void SetCallback( A* pA, A_Callback callback )
{
m_pA = pA;
m_Callback = callback;
}
void Do( void )
{
(m_pA->*m_Callback)();
}
A* m_pA;
A_Callback m_Callback;
};
int main( void )
{
B b;
C c;
/* error
c.SetCallback( &b, &B::Func );
*/
c.SetCallback( &b, static_cast<A_Callback>(&B::Func) );
c.Do();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpjbGFzcyBBCnsKcHVibGljOgogICAgdmlydHVhbCB+QSgpe30KfTsKCmNsYXNzIEIgOiBwdWJsaWMgQQp7CnB1YmxpYzoKICAgIHZvaWQgRnVuYyh2b2lkKXsgcHJpbnRmKCAiQiBGdW5jKCk7XG4iICk7IH0KfTsKCnR5cGVkZWYgdm9pZChBOjoqQV9DYWxsYmFjaykodm9pZCk7CgpjbGFzcyBDCnsKcHVibGljOgogICAgdm9pZCBTZXRDYWxsYmFjayggQSogcEEsIEFfQ2FsbGJhY2sgY2FsbGJhY2sgKQogICAgewogICAgICAgIG1fcEEgPSBwQTsKICAgICAgICBtX0NhbGxiYWNrID0gY2FsbGJhY2s7CiAgICB9CiAgICB2b2lkIERvKCB2b2lkICkKICAgIHsKICAgICAgICAobV9wQS0+Km1fQ2FsbGJhY2spKCk7CiAgICB9CiAgICBBKiAgICAgICAgIG1fcEE7CiAgICBBX0NhbGxiYWNrIG1fQ2FsbGJhY2s7Cn07CgppbnQgbWFpbiggdm9pZCApCnsKICAgIEIgYjsKICAgIEMgYzsKICAgIC8qIGVycm9yCiAgICBjLlNldENhbGxiYWNrKCAmYiwgJkI6OkZ1bmMgKTsKICAgICovCiAgICBjLlNldENhbGxiYWNrKCAmYiwgc3RhdGljX2Nhc3Q8QV9DYWxsYmFjaz4oJkI6OkZ1bmMpICk7CiAgICBjLkRvKCk7CiAgICByZXR1cm4gMDsKfQ==