运算符<<重载继承,为什么我从基类输入,而不是子类?

时间:2016-04-05 22:41:34

标签: c++ inheritance operator-overloading

我有一个课程,我们称之为A,它只有一个字段aa。我有另一个类B,它继承了类A,而不是拥有aa字段,它也有自己的字段bb。现在,我为这两个类重载了operator <<cout)。我试图使用polimorphism,但似乎polimorphism与运算符不兼容。使用运算符aa显示对象cout时,我的代码仅显示obj字段。

我的意思是,我是否总是需要添加virtual字来重载子类中基类的函数?如果是这样,我应该如何对运营商做同样的事情,运营商不能虚拟......

#include <iostream>
#include <ostream>
using namespace std;

class A
{
    protected :
        int aa;

    public:
        A(int aa) {this->aa = aa;}
        ~A(){}
        friend ostream &operator<<(ostream &os, const A& obj);
        virtual void show() {cout << "a = " << aa << "\n"; }
};

ostream &operator<<(ostream &os, const A& obj)
{
    for(int i=0; i<80; i++)
        os << "-";
    os << "\n";

    os << "a = " << obj.aa << "\n";

    for(int i=0; i<80; i++)
        os << "-";
    os << "\n";

    return os;
}

class B : public A
{
    private :
        int bb;

    public:
        B(int aa, int bb) : A(aa) {this->bb = bb;}
        ~B(){}
        friend ostream &operator<<(ostream &os, const B& obj);
        void show() {cout << "a = " << aa << "\n"; cout << "b = " << bb << "\n";}
};

ostream &operator<<(ostream &os, const B& obj)
{
    for(int i=0; i<80; i++)
        os << "-";
    os << "\n";

    os << "a = " << obj.aa << "\n";
    os << "b = " << obj.bb << "\n";

    for(int i=0; i<80; i++)
        os << "-";
    os << "\n";

    return os;
}


int main()
{
    A *obj = new B(2,3);
    cout << *obj;
    obj->show();
    delete obj;

    return 0;
}

1 个答案:

答案 0 :(得分:2)

  

我的意思是,我是否总是需要添加虚拟词来重载子类中基类的函数?如果是这样,我应该如何对运营商做同样的事情,运营商不能虚拟......

当然可以。但只有成员函数可以是虚拟的,而这些运算符不是成员函数 - 它们是全局函数。

在这种情况下,您不能使它们成为成员函数(因为第一个参数不是您的类的实例)。但是你可以创建一个虚拟成员函数并让操作员调用它:

class A
{
protected:
    virtual void print(ostream &);
public:
    friend ostream &operator<<(ostream &os, const A& obj);
    // ... other stuff ...
};

ostream &operator<<(ostream &os, const A& obj)
{
    obj.print(os);
    return os;
}

然后覆盖print而不是operator<<