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 A { public: virtual void Call(Child *obj, Callback cb, Callback cc) = 0; }; class B : public A { public: void Call(Child *obj, Callback cb, Callback cc) { cb.Execute(obj, this); } }; class C : public A { public: void Call(Child *obj, Callback cb, Callback cc) { cc.Execute(obj, this); } }; class Base { protected: virtual void F1(A *p) = 0; }; class Child : public Base { public: void F1(A *p) { p->Call(this, Callback(&Child::F1B), Callback(&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(); }