我在继承方面遇到了巨大麻烦。我有一个正常的节点,如下所示(请忽略代码中的任何错字,我现在没有错,但可以编译)
template<typename T>
class Node {
Node<T> *parent, *left, *right;
...//simple methods
}
然后,我使用刚刚创建的节点实现普通的BST
:
template<typename T>
class tree {
virtual Node<T>* insert(T value);
...// other methods of tree
}
现在我想制作一棵红黑树,但是它的代码几乎相同,所以我只是尝试覆盖,例如插入:
template<typename T>
class rb_node : public node<T> {
int color;
...//methods to retrieve and set the color as well the constructor
}
template<typename T>
class rb_tree : public tree<T> {
Node<T> *insert(T value){
auto z = (rb_node<T>*)tree<T>::insert(value);
while(z->parent()->color() == RED)...
}
自从我进行强制转换以来,z->parent()
被识别为rb_node
,但是父级不知道,因为它是在基类中构造的,因此它没有color()
方法。我该如何解决这个将近两个星期的生命?
糟糕:如果有人需要,我的代码在https://github.com/dodonut/Algorithms/tree/master/Data_Structures。
我尝试在node
到rb_node
内的方法上重写构造函数上nullptr
到rb_node
的变量(但不能强制转换return rb_node
)(但基类方法的签名不同)
答案 0 :(得分:4)
一个可能的解决方案可能是让基tree
类也接受可选的NodeType
模板参数?如
template<typename T, typename NodeT = Node<T>>
class tree
{
...
virtual NodeT* insert(T const& value);
...
};
然后,子类可以使用其特殊的rb_node
:
template<typename T>
class rb_tree : public tree<T, rb_node<T>>
{
...
rb_node<T>* insert(T const& value) override;
...
};