【发布时间】:2018-12-18 17:31:10
【问题描述】:
考虑以下
struct Message
{
Message() : description("Generic message") {}
Message(const std::string& d) : description(d) {}
std::string description;
};
struct MessageType1 : public Message
{
MessageType1() : Message("MessageType1"), a_boolean(false) {}
bool a_boolean;
};
// more specific Message types
class AbstractMessagePasser
{
public:
virtual ~AbstractMessagePasser();
void receive(const Message& m) {}
};
class Component1
{
AbstractMessagePasser* m_fwd;
public:
template<class M>
void send(const M& m)
{
m_fwd->receive(m);
}
};
// more classes like Component1 with a pointer to an AbstractMessagePasser
class MessagePasser : public AbstractMessagePasser
{
Component1* cp1;
Component2* cp2;
using AbstractMessagePasser::receive;
// overloads of AbstractMessagePasser::receive() for different message types
void receive(const MessageType1&)
{
// do something
}
void receive(const MessageType2&)
{
// do something different
}
};
换句话说,我有一些组件,它们之间的通信是使用不同派生类型的Message 完成的。所有的通信都应该在MessagePasser处理。为此,我希望MessagePasser 在组件发送Message 时调用receive() 的正确重载,即如果组件调用send(const MessageType1&),则应在MessagePasser 中调用receive(const MessageType1)。然而基类版本总是被调用。
我也尝试过模板专业化但没有成功(在AbstractMessagePasser 中模板化receive。有没有简单的方法来完成这个?
【问题讨论】:
-
关键字:动态调度。
-
如果所有通信都应该在
MessagePasser中处理,为什么AbstractMessagePasser存在?
标签: c++ oop templates c++03 c++98