fork download
  1. #include <stdio.h>
  2.  
  3. class A
  4. {
  5. public:
  6. virtual ~A(){}
  7. };
  8.  
  9. class B : public A
  10. {
  11. public:
  12. B() : m_Value(99){}
  13. void Func(void){ printf( "B value : %d;\n", m_Value ); }
  14. int m_Value;
  15. };
  16.  
  17. typedef void(A::*A_Callback)(void);
  18.  
  19. class C
  20. {
  21. public:
  22. void SetCallback( A* pA, A_Callback callback )
  23. {
  24. m_pA = pA;
  25. m_Callback = callback;
  26. }
  27. void Do( void )
  28. {
  29. (m_pA->*m_Callback)();
  30. }
  31. A* m_pA;
  32. A_Callback m_Callback;
  33. };
  34.  
  35. int main( void )
  36. {
  37. A a;
  38. B b;
  39. C c;
  40. c.SetCallback( &b, static_cast<A_Callback>(&B::Func) );
  41. c.Do();
  42. c.SetCallback( &a, static_cast<A_Callback>(&B::Func) ); // ビルド通るけどこれはダメ。なぜならAはB::Funcを持ってないから。
  43. c.Do(); // インスタンスはAなのにBのメンバの値を見ようとしているためゴミ値がprintされる
  44. return 0;
  45. }
Success #stdin #stdout 0.02s 2724KB
stdin
Standard input is empty
stdout
B value : 99;
B value : -1079400976;