Вызов корректной перегрузки в производном классе - PullRequest
0 голосов
/ 18 декабря 2018

Рассмотрим следующее

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 вызывал правильную перегрузку receive(), когда компонент отправляет Message, т.е. если компонент вызывает send(const MessageType1&), тогда receive(const MessageType1) следует вызывать в MessagePasser.Однако версия базового класса всегда вызывается.

Я также безуспешно пытался специализировать шаблоны (создание шаблонов receive в AbstractMessagePasser. Есть ли простой способ сделать это?

1 Ответ

0 голосов
/ 18 декабря 2018

Вы должны сделать метод получения виртуальным.В противном случае это просто статический вызов функции.

class AbstractMessagePasser
{
public:
    virtual ~AbstractMessagePasser();

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