class Base; class Child; class B; class C; template class Callback { private: typedef void (Class::*Method)(ParamType); Method m_method; public: Callback(Method method) : m_method(method) {} void Execute(Class *c, ParamType p) { (c->*m_method)(p); } }; class Dummy { }; class A { public: typedef void (A::*Method)(Dummy *obj, Callback cb, Callback cc); //typedef void (A::*Method)(Child *obj, Callback cb, Callback cc); Method m_method; A(Method m) : m_method(m) {} //virtual void Call(Child *obj, Callback cb, Callback cc) = 0; template void ACall(Class *obj, void (Class::*methodB)(B*), void (Class::*methodC)(C*)) { typedef void (Dummy::*MethodB)(B*); typedef void (Dummy::*MethodC)(C*); MethodB b = *((MethodB*)(&methodB)); MethodC c = *((MethodC*)(&methodC)); (this->*m_method)((Dummy*)obj, Callback(b), Callback(c)); } }; class B : public A { public: void BCall(Child *obj, Callback cb, Callback cc) { cb.Execute(obj, this); } B() : A((A::Method)&B::BCall) {} }; class C : public A { public: void CCall(Child *obj, Callback cb, Callback cc) { cc.Execute(obj, this); } C() : A((A::Method)&C::CCall) {} }; class Base { protected: virtual void F1(A *p) = 0; }; class Child : public Base { public: void F1(A *p) { p->ACall(this, &Child::F1B, &Child::F1C); } void F1B(B *p) { printf("Child B!\n"); } void F1C(C *p) { printf("Child C!\n"); } }; void main() { Child x; B b; x.F1(&b); C c; x.F1(&c); getch(); }