У меня есть несколько классов, которые представляют различные компьютерные компоненты, каждый из которых перегруженного <<
оператор объявляется следующим образом:Перегружен выход оператор в базовом классе
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
+1 Я действительно видел это пару раз, и это имеет смысл. Но, учитывая, что 'output' является общедоступным,' operator << 'не обязательно должен быть другом (и не должен). Кроме того, в прошлом я видел подпись как: 'virtual std :: ostream & print (std :: ostream & out) const;' так, чтобы она могла быть закодирована при вызове вручную: 'myobj.output (std :: cout) <
@ DavidRodríguez-dribeas Вы правы, декларация друга не нужна, просто я привык к привычке. :) Обновленный код в соответствии с вашими предложениями. –