制作奇怪的多态性

时间:2011-07-31 18:23:22

标签: c++ polymorphism

我正试图在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))。

Design 问题是

我该如何解决? 有没有其他方法可以使它工作?

谢谢,原谅我的英语。

2 个答案:

答案 0 :(得分:2)

你想要double dispatch。虚函数直接只提供单个函数。双重调度的一个很好的例子是Visitor pattern,它可以直接适用于你的任务。

答案 1 :(得分:1)

您只能在基类中重写逆转:派生类方法中的参数类型必须派生,而不是基类中的参数类型。< / p>

否则(如你的情况),你只是在写一个不同的功能。