У меня есть базовый класс, а затем несколько производных классов. Я хотел бы перегрузить оператор «<<» для этих производных классов. Для обычных операторов, то есть '+', виртуальные функции делают свое дело. Я понимаю, что стандартным соглашением является объявление
friend ostream& operator<<(ostream& out, MyClass& A);
в моем классе, а затем определение функции после класса. Априори я бы подумал, что добавление виртуального к приведенному выше определению заставит его работать, но после некоторых размышлений (и ошибок моего компилятора) я понимаю, что это не имеет большого смысла.
Я попробовал другой подход к тесту, когда все члены класса являются общедоступными.Например:
class Foo{
//bla
};
ostream& operator<<(ostream& out, Foo& foo){
cout << "Foo" << endl;
return foo;
}
class Bar : public Foo{
//bla
};
ostream& operator<<(ostream& out, Bar& bar){
cout << "Bar" << endl;
return bar;
}
///////////////////////
Bar bar = Bar();
cout << bar << endl; // outputs 'Foo', not 'Bar'
Таким образом, это в некотором роде «испорченный полиморфизм» - вызывается оператор базового класса <<, а не оператор производного класса. Как в приведенном выше примере вызвать правильный оператор для производного класса? И в более общем плане, если в моем классе есть частные члены, которые я хочу защитить, как я могу исправить перегрузку оператора при использовании ключевого слова friend?