节点层次结构和继承
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>
。
一个c++类模板的例子。
如果SceneNode
继承BaseNode
,您可以简单地将SceneNode
赋值给BaseNode*
类型,而不需要强制转换。您可能还需要调用基类的构造函数。
class SceneNode : public BaseNode {
public:
SceneNode() : BaseNode("foo") {}
};
由此,如果调用s = new SceneNode
,应该能够将s赋值给BaseNode*
的集合,而不需要强制转换。
相关文章:
- 继承层次结构并将元素添加到向量
- 如何在继承层次结构中调用具有默认参数的构造函数?
- 在C++继承层次结构时提取实现者
- 在继承层次结构中复制和移动
- 当中间类跳过实现时,在继承层次结构中执行哪种虚拟方法
- Sean Parent:对于继承层次结构中的多态类型,具有可变对象是极端的例外
- 检查类是否在继承层次结构中显式定义了成员类型
- 有关继承层次结构的问题,没有任何虚拟功能
- 在 c++ 中,通常比较继承层次结构中的对象
- 在继承层次结构中将方法定义为虚拟方法一次,以使多态性发挥作用
- 避免C++中继承层次结构中的重复代码
- dynamic_cast<>是否仅限于沿继承层次结构的直接强制转换?
- 如何为类的继承层次结构的获取者创建统一的接口
- 继承层次结构中级中的新虚函数
- 通过并行继承层次结构中的父级关联子项
- OO 正确性 - 继承层次结构 - 谁创建其他对象使用的对象
- 最佳继承层次结构,例如:Model3D -> ModelAnimation VS ModelAnimation or Model3D -> ModelAnimation
- 如何使用容器中对象的继承层次结构来维护开放/封闭原则
- 对于空类的单继承层次结构,是否可以保证大小相等
- 继承层次结构中接口与实现的分离(C++新手)