所以假设我在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/