所以假设我在C++中有一个像这样的树类

class Node{
    void addChild(Node*);
    /*obvious stuff*/
    protected:
        Node* parent;
        vector<Node*> children
}

class specialNode : public Node{
    void addChild(specialNode*);
    /*obvious stuff*/
    /*special stuff*/
}

现在,每当我访问specialTree中的子级时,我显然会得到Node *,而不是specialNode *。

但是,这个specialNode *具有Node所没有的成员变量和函数。

我可以强制specialNode仅将specialNode作为子级,否则会中断编译时间,
但是访问子级/父级时仍会得到Node *,并且无论何时要使用特殊功能(即使在specialNode函数中),都必须强制转换它。

是否有任何聪明的方法,或者只有更好的方法可以解决此问题?
除了每次都逐字转换之外?

最佳答案

如果您只需要树中的SpecialNode对象(并且只想将所有通用树功能封装在Node中),则可以使Node成为所谓的“混合”类,例如

template <class N>
class Node : public N {
public:
  void addChild(Node<N>*);
protected:
  Node<N>* parent;
  vector<Node<N>*> children;
};

class SpecialNodeBase {
  // Here comes all "special" data/methods for your "special" tree
};

typedef Node<SpecialNodeBase> SpecialNode;

之后,您可以构造一个SpecialNode对象树,并使用SpecialNodeBase中的所有方法以及Node中的其他树管理功能

关于c++ - C++处理自引用的派生类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3507600/

10-11 16:14