Наследование от класса, но с использованием подкласса атрибута

#c #data-structures

#c #структуры данных

Вопрос:

Я должен реализовать красное / черное дерево (RBTree) в C , наследуя от класса бинарного дерева поиска (BSTree), который я уже создал.

Класс BSTree содержит указатель узла (Node — это класс, который я создал для BSTree) на корень дерева.

Я хочу создать подкласс узла с именем «RBTNode», который содержит атрибут color и связанные методы (поэтому RBTNode является подклассом Node), затем я хочу создать класс RBTree, наследующий от BSTree, но с новым RBTNode вместо стандартного узла.

Структура будет следующей:

  • BSTree содержит узел;
  • RBTNode является подклассом узла;
  • RBTree является подклассом BSTree;
  • RBTree содержит RBTNode;

Как я мог этого добиться?

Комментарии:

1. С помощью шаблонов Node BSTree ?

Ответ №1:

Как было предложено 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
};
 

Комментарии:

1. Кстати, я действительно не уверен, должен ли мой ответ включать в себя, как ограничить BSNode базовым классом NodeT.

2. Спасибо, брат, это работает просто отлично, и это кажется хорошим и универсальным решением моей проблемы.