【问题标题】:Calling correct overload in derived class在派生类中调用正确的重载
【发布时间】: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&amp;),则应在MessagePasser 中调用receive(const MessageType1)。然而基类版本总是被调用。

我也尝试过模板专业化但没有成功(在AbstractMessagePasser 中模板化receive。有没有简单的方法来完成这个?

【问题讨论】:

  • 关键字:动态调度。
  • 如果所有通信都应该在MessagePasser中处理,为什么AbstractMessagePasser存在?

标签: c++ oop templates c++03 c++98


【解决方案1】:

您必须将接收方法设为虚拟。否则它只是一个静态函数调用。

class AbstractMessagePasser
{
public:
    virtual ~AbstractMessagePasser();

    virtual void receive(const Message& m) {}
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2021-07-03
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多