2012-02-10 2 views
1

У меня есть несколько классов, которые представляют различные компьютерные компоненты, каждый из которых перегруженного << оператор объявляется следующим образом:Перегружен выход оператор в базовом классе

friend ostream& operator << (ostream& os, const MotherBoard& mb); 

Каждый возвращает объект ostream с уникальным потоком, описывающим этот компонент, некоторые из которых состоят из других компонентов. Я решил создать базовый класс с именем Component, чтобы генерировать уникальный идентификатор, а также некоторые другие функции, которые будут публиковаться всеми компонентами. Конечно, перегруженный оператор << не работает с указателями на объекты Component.

мне было интересно, как я бы эффект что-то вроде чистой виртуальной функции, которая будет записана поверх << оператором каждого производного класса, так что я мог бы сделать что-то вроде:

Component* mobo = new MotherBoard(); 

cout << *mobo << endl; 

delete mobo; 

Также в связи с: overloading << operators and inherited classes

ответ

5

Возможно, что-то вроде этого:

#include <iostream> 

class Component 
{ 
public: 
    // Constructor, destructor and other stuff 

    virtual std::ostream &output(std::ostream &os) const 
     { os << "Generic component\n"; return os; } 
}; 

class MotherBoard : public Component 
{ 
public: 
    // Constructor, destructor and other stuff 

    virtual std::ostream &output(std::ostream &os) const 
     { os << "Motherboard\n"; return os; } 
}; 

std::ostream &operator<<(std::ostream &os, const Component &component) 
{ 
    return component.output(os); 
} 

int main() 
{ 
    MotherBoard mb; 
    Component &component = mb; 

    std::cout << component; 
} 
+0

+1 Я действительно видел это пару раз, и это имеет смысл. Но, учитывая, что 'output' является общедоступным,' operator << 'не обязательно должен быть другом (и не должен). Кроме того, в прошлом я видел подпись как: 'virtual std :: ostream & print (std :: ostream & out) const;' так, чтобы она могла быть закодирована при вызове вручную: 'myobj.output (std :: cout) <

+0

@ DavidRodríguez-dribeas Вы правы, декларация друга не нужна, просто я привык к привычке. :) Обновленный код в соответствии с вашими предложениями. –

Смежные вопросы