C++ C++;注册回调时无法将基类转换为派生类

C++ C++;注册回调时无法将基类转换为派生类,c++,stl,callback,C++,Stl,Callback,我想创建一个回调到同一层次结构的不同对象的映射,但我得到以下错误: class ResponseBase { public: virtual bool Parse() = 0; }; class MyResponse : public ResponseBase { public: bool Parse() { return true; } void SayHello() {} }; typedef std::tr1::function<void (Respons

我想创建一个回调到同一层次结构的不同对象的映射,但我得到以下错误:

class ResponseBase
{
public:
    virtual bool Parse() = 0;
};

class MyResponse : public ResponseBase
{
public:
    bool Parse() { return true; }
    void SayHello() {}
};

typedef std::tr1::function<void (ResponseBase*)> MYCALLBACK;
typedef std::map<int, MYCALLBACK> MYCALLBACKS;

MYCALLBACKS myCallbacks;

void RegisterCallback(int nType, MYCALLBACK myCallback)
{
    MYCALLBACKS::iterator iter = myCallbacks.find(nType);
    if (iter == myCallbacks.end())
        myCallbacks[nType] = myCallback;
    else
        iter->second = myCallback;
}

void Callback0(ResponseBase *pResponseBase) {}
void Callback1(MyResponse *pMyResponse) {}

int main()
{
    RegisterCallback(0, Callback0); // OK
    RegisterCallback(1, Callback1); // error C2664: 'void (MyResponse *)' : cannot convert parameter 1 from 'ResponseBase *' to 'MyResponse *'

    return 0;
}
类响应库
{
公众:
虚拟布尔解析()=0;
};
类MyResponse:公共响应数据库
{
公众:
bool Parse(){return true;}
void SayHello(){}
};
typedef std::tr1::函数MYCALLBACK;
typedef std::map MYCALLBACKS;
我的回调我的回调;
无效注册表回调(int-nType,MYCALLBACK-MYCALLBACK)
{
MYCALLBACKS::迭代器iter=MYCALLBACKS.find(nType);
if(iter==myCallbacks.end())
myCallbacks[nType]=myCallback;
其他的
iter->second=myCallback;
}
void Callback0(ResponseBase*pResponseBase){}
无效回调1(MyResponse*pMyResponse){}
int main()
{
RegisterCallback(0,Callback0);//确定
RegisterCallback(1,Callback1);//错误C2664:'void(MyResponse*)':无法将参数1从'ResponseBase*'转换为'MyResponse*'
返回0;
}
但我不想做这样的事情:

void Callback1(ResponseBase *pResponseBase)
{
    MyResponse *p = static_cast<MyResponse*>(pResponseBase);
    p->SayHello();
}
void回调1(ResponseBase*pResponseBase)
{
MyResponse*p=静态施法(前置基);
p->SayHello();
}

如何解决此错误?

如果您只是在对象中调用虚拟方法,那么您不需要对每个继承的类进行不同的回调。为什么还要强制转换?如果类型是多态的,则不需要这样做。问题是,编译器如何知道您以后不会尝试使用非
MyResponse
实例的东西调用
Callback1
?它怎么知道要尝试并强制转换它呢?听起来像是要存储一组对不同对象类型的回调。您需要存储一个包含不透明对象引用(通常称为委托)的回调对象。请参见以下示例:@willj谢谢,但是有没有其他不涉及模板的方法?