class A { public: char m_type; A(char type = 0) : m_type(type) {} }; class B : public A { public: B() : A(1) {} }; class C : public A { public: C() : A(2) {} }; class Base { public: virtual void F1(A *p) = 0; }; class Child : public Base { public: void F1(A *p); void F1A(A *p) { printf("Child A\n"); } void F1B(B *p) { printf("Child B\n"); } void F1C(C *p) { printf("Child C\n"); } }; typedef (Child::*ChildMethod)(void *); ChildMethod methods[] = { (ChildMethod)&Child::F1A, (ChildMethod)&Child::F1B, (ChildMethod)&Child::F1C }; void Child::F1(A *p) { ChildMethod m = methods[p->m_type]; (this->*m)(p); } void main() { Child x; A a; B b; C c; x.F1(& c); getch(); }