处理不同节点类型的树

时间:2011-04-26 13:53:25

标签: c++ tree

我有一个树数据结构,可以有一个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


};

编辑:更改了类型

3 个答案:

答案 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),并在派生类中重写它?即将估计专业化与专业类联系起来。这样,您就不必处理多态代码来提取特定于类型的字段。