У меня есть базовый класс, а затем несколько производных классов. Я хотел бы перегрузить оператор «<<» для этих производных классов. Для нормальных операторов, то есть '+', виртуальные функции делают свое дело. Что я понимаю под стандартным соглашением - это объявить </p>
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? </p>