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

Operator << overload inheritance, why I got input from base class, instead of child class?

本文关键字:lt 子类 输入 继承 重载 为什么 运算符 基类      更新时间:2023-10-16

我有一个类,我们称它为A,它只有一个字段aa。我有另一个类B,它继承了类A,它没有aa字段,也有自己的字段bb。现在,我为这两个类重载了operator <<cout)。我试着使用多态射,但似乎多态射不能正确地与运算符一起工作。当使用运算符cout显示对象obj时,我的代码只显示aa字段。

我的意思是,我总是需要添加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;
}

我的意思是,我总是需要添加虚拟单词来重载子类中基类的函数吗?如果是这样的话,我应该如何对待运营商,运营商不能是虚拟的。。。

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

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

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;
}

然后覆盖CCD_ 13而不是CCD_。