cout上的抽象类的多态性

时间:2015-11-14 17:51:54

标签: c++ class polymorphism operator-overloading

我有抽象类(类"父亲")和儿子类

我想在父亲身上写下运营商<<并在儿子身上实施

这里是代码

#include <iostream>

using namespace std;

class father {
    virtual friend ostream& operator<< (ostream & out, father &obj) = 0;

};

class son: public father  {
    friend ostream& operator<< (ostream & out, son &obj)
    {
        out << "bla bla";
        return out;
    }
};
void main()
{
    son obj;
    cout << obj;

}

我得到3个错误

错误3错误C2852:&#39;运营商&lt;&lt;&#39; :只能在类

中初始化数据成员

错误2错误C2575:&#39;运算符&lt;&lt;&#39; :只有成员函数和基础可以是虚拟的

错误1错误C2254:&#39;&lt;&lt;&#39; :友元函数不允许使用纯说明符或抽象覆盖说明符

我能做什么?

1 个答案:

答案 0 :(得分:1)

虽然您无法创建运算符virtual,但您可以将它们调用作为常规虚拟函数,如下所示:

class father {
    virtual ostream& format(ostream & out, father &obj) = 0;
    friend ostream& operator<< (ostream & out, father &obj) {
        return format(out, obj);
    }
};

class son: public father  {
    virtual ostream& format(ostream & out, son &obj) {
        out << "bla bla";
        return out;
    }
};

现在只有一个operator <<,但father的每个子类都可以通过覆盖虚拟成员函数format来提供自己的实现。