У меня есть рекурсивный класс, своего рода дерево, экземпляры которого являются переменными-членами. Например:
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 и реализовать новый метод в производном классе. Но этот подход не работает для 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(). Это был просто пример. Дело в том, как создать производный класс, чтобы дочерние элементы также были производным классом.