#include <stdio.h>
class A
{
public:
virtual ~A(){}
};
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);
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 )
{
A a;
B b;
C c;
c.SetCallback( &b, static_cast<A_Callback>(&B::Func) );
c.Do();
c.SetCallback( &a, static_cast<A_Callback>(&B::Func) ); // ビルド通るけどこれはダメ。なぜならAはB::Funcを持ってないから。
c.Do(); // インスタンスはAなのにBのメンバの値を見ようとしているためゴミ値がprintされる
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpjbGFzcyBBCnsKcHVibGljOgogICAgdmlydHVhbCB+QSgpe30KfTsKCmNsYXNzIEIgOiBwdWJsaWMgQQp7CnB1YmxpYzoKICAgIEIoKSA6IG1fVmFsdWUoOTkpe30KICAgIHZvaWQgRnVuYyh2b2lkKXsgcHJpbnRmKCAiQiB2YWx1ZSA6ICVkO1xuIiwgbV9WYWx1ZSApOyB9CiAgICBpbnQgbV9WYWx1ZTsKfTsKCnR5cGVkZWYgdm9pZChBOjoqQV9DYWxsYmFjaykodm9pZCk7CgpjbGFzcyBDCnsKcHVibGljOgogICAgdm9pZCBTZXRDYWxsYmFjayggQSogcEEsIEFfQ2FsbGJhY2sgY2FsbGJhY2sgKQogICAgewogICAgICAgIG1fcEEgPSBwQTsKICAgICAgICBtX0NhbGxiYWNrID0gY2FsbGJhY2s7CiAgICB9CiAgICB2b2lkIERvKCB2b2lkICkKICAgIHsKICAgICAgICAobV9wQS0+Km1fQ2FsbGJhY2spKCk7CiAgICB9CiAgICBBKiAgICAgICAgIG1fcEE7CiAgICBBX0NhbGxiYWNrIG1fQ2FsbGJhY2s7Cn07CgppbnQgbWFpbiggdm9pZCApCnsKICAgIEEgYTsKICAgIEIgYjsKICAgIEMgYzsKICAgIGMuU2V0Q2FsbGJhY2soICZiLCBzdGF0aWNfY2FzdDxBX0NhbGxiYWNrPigmQjo6RnVuYykgKTsKICAgIGMuRG8oKTsKICAgIGMuU2V0Q2FsbGJhY2soICZhLCBzdGF0aWNfY2FzdDxBX0NhbGxiYWNrPigmQjo6RnVuYykgKTsgLy8g44OT44Or44OJ6YCa44KL44GR44Gp44GT44KM44Gv44OA44Oh44CC44Gq44Gc44Gq44KJQeOBr0I6OkZ1bmPjgpLmjIHjgaPjgabjgarjgYTjgYvjgonjgIIKICAgIGMuRG8oKTsgLy8g44Kk44Oz44K544K/44Oz44K544GvQeOBquOBruOBq0Ljga7jg6Hjg7Pjg5Djga7lgKTjgpLopovjgojjgYbjgajjgZfjgabjgYTjgovjgZ/jgoHjgrTjg5/lgKTjgYxwcmludOOBleOCjOOCiwogICAgcmV0dXJuIDA7Cn0=