rendered paste bodyclass 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)(A *);
ChildMethod methods[] =
{
(ChildMethod)&Child::F1A,
(ChildMethod)&Child::F1B,
(ChildMethod)&Child::F1C
};
#define USE_SWITCH
void Child::F1(A *p)
{
#ifndef USE_SWITCH
(this->*methods[p->m_type])(p);
#else
switch(p->m_type)
{
case 0: F1A(p); break;
case 1: F1B((B*)p); break;
case 2: F1C((C*)p); break;
}
#endif
}
void main()
{
Child x;
A *a = new A;
A *b = new B;
A *c = new C;
x.F1(a);
x.F1(b);
x.F1(c);
getch();
}