rendered paste bodyclass Base;
class Child;
class B;
class C;
template<class Class, typename ParamType>
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<Child, B*> cb, Callback<Child, C*> cc) = 0;
};
class B : public A
{
public:
void Call(Child *obj, Callback<Child, B*> cb, Callback<Child, C*> cc)
{
cb.Execute(obj, this);
}
};
class C : public A
{
public:
void Call(Child *obj, Callback<Child, B*> cb, Callback<Child, C*> 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, B*>(&Child::F1B), Callback<Child, C*>(&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();
}