[英]Node hierarchy and inheritance
我制作了一个场景图层次结构,其中每个节点都有一个父级,也可能有一个子级。 我创建了这个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
我的目标是拥有“许多类型”的BaseNode,因此我不必每次都重写其父/子功能。
知道我该如何做得更好吗?
为什么不为您的BaseNode
类使用模板?
这样,您就可以在不同类型的BaseNode之间使用通用代码。
例如,要创建一个SceneNode
,您可以执行BaseNode<SceneNode>
。
如果SceneNode
继承了BaseNode
,则可以简单地将SceneNode
分配给BaseNode*
类型,而无需BaseNode*
。 您可能还需要调用基类的构造函数。
class SceneNode : public BaseNode {
public:
SceneNode() : BaseNode("foo") {}
};
由此,如果调用s = new SceneNode
,则无需进行BaseNode*
应该能够将s分配给BaseNode*
的集合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.