Вы можете создать базовый класс для своих сообщений:
class Message {
public:
virtual void do_something() = 0;
};
class MessageA : public Message {
public:
void do_something() override {
// ...
}
};
и наследовать все остальные сообщения от базового (как это делает MessageA в примере). Чем вы сможете использовать их как
void recieve_message(Message&) {
// ...
};
. Он также предоставляет полезный метод для расширения: вы можете просто добавить другой класс, производный от Message.
Извините, если я что-то неправильно понял: вопрос показался мне очень запутанным.