У меня есть рекурсивный класс, своего рода дерево, экземпляры которого являются переменными-членами. Например:
template<class T>
class Tree {
public:
/* Constructors, etc. */
protected:
T m_value;
Tree<T> *leftChild;
Tree<T> *rightChild;
};
Если я хочу добавить метод, который печатает все значения с использованием обхода в порядке, я мог бы сделать это:
template <class T>
void Tree<T>::printInOrder()
{
leftChild->printInOrder();
std::cout << m_value << std::endl;
rightChild->printInOrder();
}
Но что, если по разным причинам я не смог или не захотел изменить реализацию Tree? Если бы класс не был рекурсивным, то есть не содержал его экземпляров, я мог бы просто наследовать от Tree и реализовывать новый метод в производном классе. Но этот подход не работает для дерева.
template <class T>
class DerivedClass : public Tree<T> {
public:
void printInOrder();
}
template <class T>
void DerivedClass<T>::
printInOrder()
{
this->leftChild->printInOrder();
std::cout << this->m_value << std::endl;
this->rightChild->printInOrder();
}
leftChild и rightChild являются экземплярами Tree и поэтому не имеют метода printInOrder ().
Может кто-нибудь предложить способ сделать это модульным способом без изменения реализации дерева. Это нормально, чтобы изменить, как это реализовано в целом, если вам не нужно менять его всякий раз, когда вы хотите расширить / извлечь из класса. Я могу увидеть возможный способ сделать это, сделав в шаблонном классе T методы, которые делают то, что я хочу, но это выглядит просто ужасно. Должен быть лучший способ.
Я очень рад, что кто-то указал, что я упустил что-то очевидное. Такое ощущение, что я чувствую.
Редактировать: Дело не в том, как реализовать printInOrder (). Это был просто пример. Дело в том, как создать класс так, чтобы дети были также производным классом.