继承中的Istream和ostream

Istream and ostream in inheritance

本文关键字:ostream Istream 继承      更新时间:2023-10-16

我有两个类:

class a{
    friend istream &operator>> (istream&in, a&ob) { }
    friend ostream &operator<< (ostream&out, const a&ob) { }
}
class b:public a{
    friend istream &operator>> (istream&in, b&ob) { }
    friend ostream &operator<< (ostream&out, const b&ob) { }
}

a类效果很好。我可以读写a类型的对象。类b继承了类a的所有内容,并添加了一些新数据。在我的istream和ostream操作符类b是否有一种方法来读取和写入使用类a的输入/输出操作符的公共字段?谢谢你。

您可以通过将ob强制转换为父类的类型来重用操作符:

ostream &operator<< (ostream& out, const b& ob) {
   // Output the parts common to a and b
   out << static_cast<const a&>(ob);
   // Do additional things specific to b
   out << some_part_specific_to_b;
   return out;
}

保留基类的提取器和插入器重载,并将实际操作推迟到虚成员函数:

istream& operator>>(istream& in, a& ob)
{
    ob.read(in);
    return in;
}
ostream& operator<<(ostream& out, const a& ob)
{
    ob.write(out);
    return out;
}

b的重写可以简单地调用基类重载:

class b : public a {
public:
    void read(std::istream& is) {
        a::read(is);
        // read into derived class
    }
    void write(std::ostream& os) {
        a::write(os);
        // write out derived class
    }
};