要弄清楚哪个函数被覆盖并不容易——即使你可以,它也是一个开发人员很难遵循的设计:客户端必须实现其中一个,但不是 2——开发人员可能会忘记它,并且他们可能不喜欢!
我会根据您的设计建议一种替代方法:
你的框架
class Base0
{
public:
// other basic members
};
template<class T>
class Base : public Base0
{
virtual void OnMsgReceived(const char *msg, T &response) = 0;
};
typedef Base<char*> BaseChar;
typedef Base<string&> BaseString;
void run(Base0* pBase)
{
const char* msg = getmsg();
BaseChar* p = dynamic_cast<BaseChar*>(pBase);
if(p != NULL)
{
char* response; //
p->OnMsgReceived(msg, response)
return;
}
BaseString* p2 = dynamic_cast<BaseString*>(pBase);
if(p2 != NULL)
{
string response; //
p2->OnMsgReceived(msg, response)
return;
}
}
客户代码
class Derived: public BaseChar
{
public:
virtual void OnMsgReceived(const char *msg, char* &response)
{
// do sth
}
};
您的框架的用户需要实现 BaseChar 或 BaseString,然后一切正常。