операторы перегрузки << и унаследованные классы

У меня есть базовый класс, а затем несколько производных классов. Я хотел бы перегрузить оператор «<<» для этих производных классов. Для обычных операторов, то есть '+', виртуальные функции делают свое дело. Я понимаю, что стандартным соглашением является объявление

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?

9
задан andyInCambridge 7 October 2011 в 17:33
поделиться