2015-05-27 2 views
3

У меня есть два класса:IStream и ostream в наследстве

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. Класс b наследует все от класса a и добавляет некоторые новые данные. В моих istream и ostream операторах класса b есть способ читать и писать общие поля с использованием операторов ввода/вывода класса a? Спасибо.

ответ

2

Вы можете повторно использовать оператор литья 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; 
} 
1

Keep экстрактор и INSERTER перегрузок для базового класса, и отложить фактическую операцию виртуальной функции члена:

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 
    } 
}; 
Смежные вопросы