假设我在 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*。
但是这个特殊的Node*具有Node所没有的成员变量和函数。
我可以强制specialNode只将specialNode作为子节点,否则会在编译时中断, 但在访问子/父时我仍然得到 Node*,并且每当我想使用特殊函数时我都必须强制转换它,即使是在特殊 Node 函数中也是如此。
有什么聪明的或者更好的方法来解决这个问题吗? 除了每次都直接转换之外?
最佳答案
如果您的树中只需要 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++ 处理自引用的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3507600/