Man kunne kaste sig ud i:
#include <iostream>
class Base
{
public:
virtual int Func1(int, int) = 0;
virtual int Func2(int, int) = 0;
static int CallFunc1(Base *ptr, int a, int b)
{
return ptr->Func1(a, b);
}
static int CallFunc2(Base *ptr, int a, int b)
{
return ptr->Func2(a, b);
}
};
class A : public Base
{
public:
virtual int Func1(int a, int b)
{
return a + b;
}
virtual int Func2(int a, int b)
{
return a + b;
}
};
class B : public Base
{
public:
virtual int Func1(int a, int b)
{
return a - b;
}
virtual int Func2(int a, int b)
{
return a/b;
}
};
int main()
{
A a;
B b;
Base* ptr = &a;
int (*fptr)(Base*, int, int);
fptr = &Base::CallFunc1;
std::cout << fptr(ptr, 1, 3) << std::endl;
fptr = &Base::CallFunc2;
std::cout << fptr(&b, 12, 4);
}
Tricket er at gå via en static funktion, den behøver egentlig ikke være en member af nogen class.
Den static funcktion bliver kaldt via en "normal" funktions pointer og får pointeren til objektet som parameter, og kalder så den rigtige funktion.