c++自动推导派生类

c++ automatic deduction of derived classes

假设我有这样一个基础class:

class BaseNode
{
    BaseNode* nodeA;
    BaseNode* nodeB;
};

并派生 classes 沿线:

class DecisionNode : public BaseNode
{
    //lots of variables and functions about decision making
};

class ActionNode : public BaseNode
{
    //lots of variables and functions about performing actions
};

还有一种逻辑class:

class Logic
{
    std::vector<BaseNode*> nodes;//contains DecisionNodes and ActionNodes...

    void handleNodeAutomatically(BaseNode* node)
    {
        //some funky deduction code....
        //send the node to the relevant function below
    }

    void handleDecisionNode(DecisionNode* node)
    {
        //perform decision-specific code here....
    }

    void handleActionNode(ActionNode* node)
    {
        //perform action-specific code here....
    }
};

关于我应该如何实现 'handleNodeAutomatically' 功能,您有什么建议?或者我对这应该如何工作的整个想法完全是垃圾(如果是,请告诉我!)

我知道我可以做这样的事情:

if(dynamic_cast<ActionNode*>someNode != NULL) //it turns out it's an action

但这对我来说似乎有点令人费解。而且我相信 dynamic_cast 也有一些与之相关的开销。

我也可以只有一个大的 actionAndDecisionNode class 和 all classes 的属性和布尔值 "isDecisionNode",然后测试一下,或者 'nodeType' 枚举,但是这些方法还是感觉有点乱。

因此,如果您愿意,请尝试填补 'handleNodeAutomatically' 函数中的空白。或者,或者,告诉我这个计划注定要失败,并告诉我一个更好的方法。

谢谢!

您或许可以在所有三个 class 中都有一个方法,并从 Logic class:

中调用它
class BaseNode {
    // ...
    virtual void foo();
};

class ActionNode : public BaseNode {
    // ...
    void foo(); // implements the Action version of foo()
};

class DecisionNode : public BaseNode {
    // ...
    void foo(); // implements the Decision version of foo()
};

然后:

class Logic {
    void handleNodeAutomatically(BaseNode* node)
    {
        node->foo();
    }
};

注: 有关一些技术细节,请参阅下面的评论(来自@BasileStarynkevitch 和@ChristianHackl)。