Я пытаюсь передать функцию из производного класса в функцию базового класса, которая ожидает указатель на функцию, но я получаю ошибку компилятора.
[BCC32 Error] E2034 Cannot convert 'void (Bar::*)(int)' to 'void (Foo::*)(int)'
Полагаю, это так, как задумано, но есть ли способ обойти это, не включая неприятное кастинг? Может ли boost::bind
помочь мне здесь?
#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
class Foo
{
public:
typedef void (Foo::*FFunc)(int i);
void test(FFunc f)
{
CALL_MEMBER_FN(*this,f)(123);
}
void barf1(int i) {};
};
class Bar : public Foo
{
public:
void barf2(int i) {};
};
void ffff()
{
Foo f;
f.test(Foo::barf1); // works
Bar b;
b.test(Bar::barf1); // works
b.test(Bar::barf2); // ERROR
}
В качестве примечания, у меня это нормально работает с использованием виртуальной функции, что является очевидным подходом, а не указателем на функцию, но я просто пытаюсь заставить его работать таким образом, прежде чем пытаться использовать трюк boost :: bind позже ...