наследование c ++ и перегрузка операторов - PullRequest
0 голосов
/ 20 марта 2012

У меня есть два класса, один является родителем другого. У них обоих должны быть разные функции оператора <<. Каждый класс имеет функцию вывода, которая уникальна для него. Вот как они более или менее настроены: </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>

1 Ответ

2 голосов
/ 20 марта 2012

Сделайте вывод virtual и определите operator<< только один раз с аргументом типа Tree<T>. Этого должно быть достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...