首页 文章

c继承和运算符重载

提问于
浏览
0

我有两个班,一个是另一个班的父母 . 它们都需要具有不同的运算符<<函数 . 每个类都有一个独特的输出函数 . 以下是它们或多或少的设置方式:

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 << ParseTree时,第一次迭代来自ParseTree的输出函数(由流<<“ParseTree”<< << endl语句确认),但所有后续请求似乎都是Tree的输出函数(由流<<“Tree”<< endl语句确认) . 推送到子矢量上的每个对象绝对是ParseTree . 我的猜测是ParseTree :: children与Tree :: children不同,并且出于某种原因,上下文正在被切换 . 有任何想法吗?

1 回答

  • 2

    输出 virtual 并仅使用 Tree<T> 类型的参数定义 operator<< 一次 . 这应该足够了 .

相关问题