节点层次结构和继承

时间:2015-08-31 14:10:44

标签: c++ oop inheritance polymorphism

我创建了一个场景图层次结构,其中每个节点都有一个父节点和可能的子节点。我创建了这个BaseNode类

class BaseNode
{
public:
    BaseNode(const char *nodeName, BaseNode *parent);
    ~BaseNode();

    BaseNode* addChildSceneNode(const char *name);
    void deleteChildSceneNode(const char *name);
    void deleteAllChildSceneNodes();

    BaseNode* findFirstSceneNode(const char *name);
    BaseNode* getChildSceneNode(const char *name);
    BaseNode* getChildSceneNode(unsigned int index);

    void setName(const char *name);
    void setTranformation(const glm::mat4 &transformation);

    unsigned int getNumChildren() const { return _children.size(); }
    const char *name() const { return _name.c_str(); }
    BaseNode* parent() const { return _parent; }
    const glm::mat4& transformation() const { return _transformation; }
    const glm::mat4& toRootTransformation() const { return _toRoot; }

protected:
    std::string _name;

    glm::mat4 _transformation;
    glm::mat4 _toRoot;

    BaseNode *_parent;
    std::vector<BaseNode*> _children;
};

我有这个从BaseNode继承的SceneNode类

class SceneNode : public BaseNode
{
public:
    SceneNode(const char *nodeName, SceneNode *parent);
    ~SceneNode();

    void attachRenderMeshData(RenderMeshData *renderMeshData);

    const std::vector<RenderMeshData*>* renderMeshDatas() { return &_meshDatas; }

private:
    std::vector<RenderMeshData*> _meshDatas;
};

现在我的问题是关于包含BaseNode *参数的所有成员函数。

目前,在使用SceneNode对象时,我必须将BaseNode *显式地转换为SceneNode *,如下所示

SceneNode *mySceneNode = new SceneNode("root", nullptr);
mySceneNode->addChildSceneNode("my child");
SceneNode *child = reinterpret_cast<SceneNode*>(mySceneNode->getChildSceneNode("my child")); //i thought this should be dynamic_cast but the compiler throws an error.. weird

我的目标是拥有多种类型的&#34; BaseNode,所以我不必每次都重写其父/子功能。

知道我怎么能做得更好吗?

1 个答案:

答案 0 :(得分:1)

为什么不为BaseNode课程使用模板?

这样,您可以在不同类型的BaseNode之间使用公共代码。

例如,要制作SceneNode,您可以BaseNode<SceneNode>

An example on C++ class templates.

如果SceneNode继承BaseNode,您只需将SceneNode分配给BaseNode*类型,而无需投射。您可能还需要调用基类的构造函数。

class SceneNode : public BaseNode {
public:
    SceneNode() : BaseNode("foo") {}
};

由此,如果您致电s = new SceneNode,您应该可以将s分配给BaseNode*的集合,而无需投放。