【发布时间】:2011-06-20 20:09:51
【问题描述】:
我有一个递归类,一种树,它有自己的实例作为成员变量。例如:
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() 方法。
谁能建议一种在不更改 Tree 实现的情况下以模块化方式执行此操作的方法。可以更改它的一般实现方式,只要您在想要扩展/派生类时不必更改它。通过使模板类 T 具有执行我想要的事情的方法,我可以看到一种可能的方法,但这看起来很难看。一定有更好的办法。
我很高兴有人指出我忽略了一些明显的事情。确实感觉像我一样。
编辑:重点不是如何实现 printInOrder()。那只是一个例子。关键是如何派生一个类,使子类也是派生类。
【问题讨论】:
标签: c++ inheritance recursion derived-class