我試圖從派生類傳遞一個函數,它需要一個函數指針的基類函數,但我得到一個編譯器錯誤。無法將派生類函數的指針傳遞到基類
[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
}
作爲一個方面說明,我這工作正常使用虛擬函數,這是顯而易見的方法,而不是一個函數指針,但我只是想獲得它在嘗試一些刺激前的工作是這樣的: :綁定掛羊頭賣狗肉後...
如果你有一個C++編譯器11,也許你可以使用[' std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function)和['std :: bind'](http://en.cppreference.com/w/ CPP /實用程序/功能/綁定)? – 2012-01-10 13:12:46