我有一个树数据结构,可以有一个TreeBaseNode
类派生的不同类型的节点。我已经创建了TreeBaseNode *
类型的树节点,它在运行时被分配给不同特殊节点的对象。
如何在生成遍历树上的树时从aNodeAttribute
指针访问TreeBaseNode*
(如果节点类型为SpecialNodeA
,我可以从NodeType
识别<) / p>
class TreeBaseNode
{
public:
int NodeType;
TypeA commonNodeAttributeA,
TypeB commonNodeAttributeB;
};
class SpecialNodeA : public TreeBaseNode
{
private:
TypeD aNodeAttribute
public:
SpecialNodeA(int type)
{
NodeType = type;
}
//Methods
};
class SpecialNodeB : public TreeBaseNode
{
private:
TypeE bNodeAttribute;
public:
//Methods
};
编辑:更改了类型
答案 0 :(得分:4)
c ++中没有clases数据成员的多态性,但你可以使用function-members的多态性。所以你应该在你的基类中声明virtual int getNodeAttribute(){}
。并在两个派生类中重新实现它以返回属性您想要的内容。
答案 1 :(得分:2)
Mihran建议的替代方法是使用dynamic_cast<>
将您知道类型为SpecialNodeA
的节点从TreeBaseNode
转换为SpecialNodeA
,然后调用一个合适的成员函数来检索你所追求的属性。
在这个特定的场景中,您甚至可以取消基类中的NodeType
成员,因为在不属于此类型的节点上的dynamic_cast<SpecialNodeA>
将只返回空指针。我不太喜欢层次结构,其中基类必须知道它的派生类型,因为它消除了类层次结构的一些好处,并倾向于暗示设计不像它应该的那样干净。
答案 2 :(得分:0)
根据注释中的额外信息,为什么不向基类添加公共virtual int estimate() = 0;
(假设估计的结果是int
),并在派生类中重写它?即将估计专业化与专业类联系起来。这样,您就不必处理多态代码来提取特定于类型的字段。