我正试图在C ++上做一些奇怪的多态:
我有两棵树:
州< - 舞台< - Stage_1,Stage_2,Stage_3
行动< - ActionState< - ActionState_Clear,ActionState_Begin,ActionState _ [...]
我想在Stage_1上定义一些获取Action作为参数的方法:
State
{
virtual void exec_action(Action *tAct)
{
std:cout << "NOT IMPLEMENTED" << endl;
};
}
Stage_1
{
virtual void exec_action(ActionStage_Clear *tAct)
{
std::cout << "ACTION STAGE CLEAR" << endl;
}
virtual void exec_action(ActionStage_Begin *tAct)
{
std::cout << "ACTION STAGE BEGIN" << endl;
}
}
Action *pAct = new ActionStage_Clear();
State* pSta = new Stage_1();
**pSta->exec_action(pAct);**
我希望它显示'ACTION STAGE CLEAR',但它显示'NOT IMPLEMENTED'。那是 - 我认为 - 因为没有exec_action(Action *)的任何实现(虽然它的子类有一些)。
编辑:我将向您展示图表的一小部分: 我有Stage(s)和Action(s)。我将有一个ptr到Stage_1,2 ..和一个ptr到Action_1,2 ... 我想调用 Stage_n-&gt; exec_action(Action_n),并且应该执行子代码:Action_1 :: exec_action(Action_1)。 (如果没有实现它应该调用Action :: exec_action(Action))。
问题是
我该如何解决? 有没有其他方法可以使它工作?
谢谢,原谅我的英语。
答案 0 :(得分:2)
你想要double dispatch。虚函数直接只提供单个函数。双重调度的一个很好的例子是Visitor pattern,它可以直接适用于你的任务。
答案 1 :(得分:1)
您只能在基类中重写逆转:派生类方法中的参数类型必须派生,而不是基类中的参数类型。< / p>
否则(如你的情况),你只是在写一个不同的功能。