从类继承但使用属性的子类

问题描述

我必须在 C++ 中实现一个红/黑树 (RBTree),继承自我已经创建的二叉搜索树 (BSTree) 类。

BSTree 类包含一个指向树根的节点指针(节点是我为 BSTree 创建的类)。

我想创建一个名为“RBTNode”的Node子类,其中包含颜色属性和相关方法(所以RBTNode是Node的子类),然后我想创建继承自BSTree的RBTree类,但是使用新的 RBTNode 而不是标准的 Node。

结构如下:

  • BSTree 包含节点;
  • RBTNode Node 的子类;
  • RBTree BSTree 的子类;
  • RBTree 包含 RBTNode;

我怎么能做到这一点?

解决方法

正如 Jarod42 在评论中所建议的,您可以通过使节点类型成为 BSTree 类的模板参数来实现这一点。

假设您有这两个节点类:

template<typename KeyT>
class BSNode {
public:
    KeyT key;
    // ...
};

template<typename KeyT>
class RBNode : public BSNode<KeyT> {
public:
    bool color;
};

然后您可以将节点类型模板参数添加到 BSTree 并使其默认为 BSNode。然后您可以在继承 RBNode 时使用 RBTree

template <typename KeyT,typename NodeT = BSNode<KeyT>>
class BSTree {
protected:
    NodeT *root;
};

template <typename KeyT>
class RBTree : public BSTree<KeyT,RBNode<KeyT>> {
    // root will be of type RBNode<KeyT>* here
};