c++ - 制作奇怪的多态性

标签 c++ polymorphism

我正在尝试在 C++ 上进行某种奇怪的多态性:

我有两个类树:

状态 <-- 阶段 <-- Stage_1、Stage_2、Stage_3

Action <-- 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_1, 2 .. 的指针和一个指向 Action_1, 2 ... 我想调用 Stage_n->exec_action(Action_n) 并且应该执行子代码:Action_1::exec_action(Action_1)。 (如果未实现,则应调用 Action::exec_action(Action))。

Design 问题是

我该如何解决? 有没有其他方法可以让它发挥作用?

谢谢,请原谅我的英语。

最佳答案

你想要double dispatch这里。虚函数直接只提供一个。双重分派(dispatch)的一个很好的例子是 Visitor pattern ,这可能直接适用于您的任务。

关于c++ - 制作奇怪的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6891401/

相关文章:

c++ - 等价于std::vector和其他形式的两种形式的初始化列表

python - 解释多态性

c# - 如何将 std::string& SWIG 转换为 C# 引用字符串

c++ - 在 Sublime Text 中构建系统

c++ - 组合元函数

go - Go中没有方法的结构的多态性

在子类重写方法中设置的 Java 类属性丢失

c++ - Overloaded operator new 在内部是如何工作的?

java - 如何修复java错误?

c++ - STL map 迭代器集