c ++自动推导派生类

时间:2015-02-22 09:39:53

标签: c++ inheritance polymorphism derived-class

所以说我有这样一个基类:

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

和派生类一样:

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 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类,其中 all 两个类的属性和一个布尔“isDecisionNode”值,只是测试它,或者'nodeType'枚举,但是这些方法只是感觉有点乱。

所以,如果它让你高兴,请注意填写'handleNodeAutomatically'功能中的空白。或者,或者,告诉我这个计划完全注定要失败,并告诉我一个更好的方法。

谢谢!

1 个答案:

答案 0 :(得分:4)

你可能在所有三个类中都有一个方法,并从Logic类中调用它:

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)。