我的问题是,当我在传递给回调函数的对象上调用虚函数时,会调用错误的函数,并且会出现运行时错误。
考虑头文件中的以下代码片段。代码可能无法编译,因为它只是一个片段。
class CEventBase1{
protected:
virtual void Show(int code){}
private:
static void _Base1Callback(void*ptr){
CEventBase1* pThis = static_cast<CEventBase1*>(ptr);
pThis->Show(EVENT_CODE);
}
};
class CEventBase2{
protected:
virtual void Move(int code){}
private:
static void _Base2Callback(void*ptr){
CEventBase2* pThis = static_cast<CEventBase2*>(ptr);
pThis-> Move(EVENT_MOVE);
}
};
class CAllEvents: public CEventBase1, public CEventBase2{
};
template<typename EVENTS>
class CWindow : public EVENTS{
};
class CMyEvents: public CAllEvents{
public:
virtual void Move(int code){
// Some processing
}
};
CWindow<CMyEvents> myWin;
此代码将与注册窗口实例以处理事件的某个库进行交互。类似于:
int main () {
SomeLibraryRegisterCallbackData(&myWin);
SomeLibraryRegisterEvent1Callback(CEventBase1::_Base1Callback);
SomeLibraryRegisterEvent2Callback(CEventBase2::_Base2Callback);
return SomeLibraryDispatch();
}
这个想法是,在分派期间,myWin
只要注册的事件发生,指向的指针就会传递给注册的回调。
问题:当程序尝试CMyEvents::Move()
从静态函数调用时_Base2Callback()
,该CEventBase1::Show()
函数被调用并且程序在调用者函数中崩溃,一旦Show()
返回错误:
ESP pointer is of incorrect type. this may happen when an incorrect method is called
编译器:Visual C++ 2012。