如何根据特定对象的类型调用特定函数

Kyl*_*yle 1 c++ messages

class Message {};
class BuildSandCastle : public Message {};
class DigHole : public Message {};
Run Code Online (Sandbox Code Playgroud)

给定一个任意Message*对象,如何在doMessage()不诉诸切换逻辑的情况下调用具有相同名称的函数,或者为每个消息名称创建一个具有"do"函数的MessageHandler类?

编辑:例如:

class Sandbox
{
public:
  void play(Message* m)
  {
     // call doBuildSandCastle
     // or doDigHole based on m's type
  }
  void doBuildSandCastle();
  void doDigHole();
};
Run Code Online (Sandbox Code Playgroud)

对不起我以前不清楚.

编辑:

有人可以删除这个问题的火车残骸吗?我真的不希望所有这些高中课程都是多态的.

Ale*_*ban 8

编辑:现在问题已经澄清,这是新的答案:

您可以让您的消息对象调用正确的函数:

void play(Message* m) { m->play(this); } 
Run Code Online (Sandbox Code Playgroud)

或者你可以在Sandbox中有一个函数指针映射,并根据消息名称(或typeid)执行相应的函数,例如

handler_map[m.name()]();
Run Code Online (Sandbox Code Playgroud)

我会使用Boost :: function在地图中存储函数指针.


老回答:我认为你需要的是虚函数:

class Message 
{
  virtual void doMessage { std::cout << "message" << std::endl; }
};
class BuildSandCastle : public Message 
{
  virtual void doMessage { std::cout << "build sand castle" << std::endl; }
};
class BuildSandCastle : public Message 
{
  virtual void doMessage { std::cout << "dig hole" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)

当你这样打电话时doMessage:

Message* msg = new BuildSandCastle();
msg->doMessage();
Run Code Online (Sandbox Code Playgroud)

它将输出"建造沙堡".