#include <stdio.h>
class A
{
public:
virtual ~A(){}
void A_Func(void){ printf( "A_Func();\n" ); }
};
class B : public A
{
public:
B() : m_Value(99){}
void Func(void){ printf( "B value : %d;\n", m_Value ); }
int m_Value;
};
typedef void(A::*A_Callback)(void);
typedef void(B::*B_Callback)(void);
class C
{
public:
void SetCallback( B* pB, B_Callback callback )
{
m_pB = pB;
m_Callback = callback;
}
void Do( void )
{
(m_pB->*m_Callback)();
}
B* m_pB;
B_Callback m_Callback;
};
int main( void )
{
B b;
C c;
c.SetCallback( &b, &A::A_Func );
c.Do();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpjbGFzcyBBCnsKcHVibGljOgogICAgdmlydHVhbCB+QSgpe30KICAgIHZvaWQgQV9GdW5jKHZvaWQpeyBwcmludGYoICJBX0Z1bmMoKTtcbiIgKTsgfQp9OwoKY2xhc3MgQiA6IHB1YmxpYyBBCnsKcHVibGljOgogICAgQigpIDogbV9WYWx1ZSg5OSl7fQogICAgdm9pZCBGdW5jKHZvaWQpeyBwcmludGYoICJCIHZhbHVlIDogJWQ7XG4iLCBtX1ZhbHVlICk7IH0KICAgIGludCBtX1ZhbHVlOwp9OwoKdHlwZWRlZiB2b2lkKEE6OipBX0NhbGxiYWNrKSh2b2lkKTsKdHlwZWRlZiB2b2lkKEI6OipCX0NhbGxiYWNrKSh2b2lkKTsKCmNsYXNzIEMKewpwdWJsaWM6CiAgICB2b2lkIFNldENhbGxiYWNrKCBCKiBwQiwgQl9DYWxsYmFjayBjYWxsYmFjayApCiAgICB7CiAgICAgICAgbV9wQiA9IHBCOwogICAgICAgIG1fQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgIH0KICAgIHZvaWQgRG8oIHZvaWQgKQogICAgewogICAgICAgIChtX3BCLT4qbV9DYWxsYmFjaykoKTsKICAgIH0KICAgIEIqICAgICAgICAgbV9wQjsKICAgIEJfQ2FsbGJhY2sgbV9DYWxsYmFjazsKfTsKCmludCBtYWluKCB2b2lkICkKewogICAgQiBiOwogICAgQyBjOwogICAgYy5TZXRDYWxsYmFjayggJmIsICZBOjpBX0Z1bmMgKTsKICAgIGMuRG8oKTsKICAgIHJldHVybiAwOwp9