У меня есть два класса, один является родителем другого. У них обоих должны быть разные функции оператора <<. Каждый класс имеет функцию вывода, которая уникальна для него. Вот как они более или менее настроены: </p>
template <class T>
class Tree {
protected:
T elem;
vector< Tree<T>* > children;
public:
ostream &output(ostream& stream,int level) {
stream << "Tree" << endl;
for (int j=0;j<level;j++) stream << " ";
stream << '\'' << this->elem << '\'' << endl;
for (unsigned int i=0;i<this->children.size();i++) {
this->children[i]->output(stream,level+1);
}
return stream;
}
template <class U>
friend ostream &operator<<(ostream &cout,Tree<U> &obj);
};
template <class T>
ostream &operator<<(ostream &stream,Tree<T> &obj) {
obj.output(stream,0);
return stream;
};
template <class T>
class ParseTree : public Tree<T> {
protected:
ParseTree<T>* elemTree;
vector< ParseTree<T>* > children;
public:
ostream &output(ostream& stream,int level) {
stream << "ParseTree" << endl;
if (elemTree == NULL) {
for (int j=0;j<level;j++) stream << " ";
stream << '\'' << this->elem << '\'' << endl;
}
else {
elemTree->output(stream,level+1);
}
for (unsigned int i=0;i<this->children.size();i++) {
this->children[i]->output(stream,level+1);
}
return stream;
}
template <class U>
friend ostream &operator<<(ostream &cout,ParseTree<U> &obj);
};
template <class T>
ostream &operator<<(ostream &stream,ParseTree<T> &obj) {
obj.output(stream,0);
return stream;
};
Обе функции вывода рекурсивно распечатывают дерево, но ParseTree немного отличается. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь выполнить cout << a ParseTree, первая итерация выполняется из выходной функции ParseTree (что подтверждается потоком << "ParseTree" << endl), но все последующие запросы выглядят как Tree Выходная функция (что подтверждается потоком << «Tree» << endl). Каждый объект, помещенный в дочерний вектор, определенно является ParseTree. Я предполагаю, что ParseTree :: children отличается от Tree :: children, и по какой-то причине контекст переключается. Есть идеи? </p>