【问题标题】:Inheriting from a class but using a subclass of an attribute从类继承但使用属性的子类
【发布时间】:2021-01-18 18:17:11
【问题描述】:

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

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

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

结构如下:

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

我怎样才能做到这一点?

【问题讨论】:

  • BSTree模板Node

标签: c++ data-structures


【解决方案1】:

正如 Jarod42 在 cmets 中所建议的,您可以通过将节点类型设置为 BSTree 类的模板参数来实现这一点。

假设你有这两个节点类:

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

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

然后您可以在BSTree 中添加一个节点类型模板参数,并默认设置为BSNode。然后您可以在继承RBTree 时使用RBNode

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
};

【讨论】:

  • 顺便说一句,我真的不确定我的答案是否应该包括如何将 BSNode 约束为 NodeT 的基类。
  • 谢谢兄弟,这很好用,它似乎是解决我问题的好方法。
猜你喜欢
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多