Tengo una clase base y luego varias clases derivadas. Me gustaría sobrecargar el operador "< <" para estas clases derivadas. Para los operadores normales, es decir, '+', las funciones virtuales hacen el truco. Lo que yo entiendo que es la convención estándar es declararsobrecarga << operadores y clases heredadas
friend ostream& operator<<(ostream& out, MyClass& A);
dentro de mi clase y luego definir la función después de la clase. A priori, creo que agregar virtual a la definición anterior lo haría funcionar, pero después de pensar un poco (y los errores de mi compilador) me doy cuenta de que no tiene mucho sentido.
Probé una táctica diferente en un caso de prueba, donde todos los miembros de la clase son públicos. Por ejemplo:
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'
Así que de alguna manera esto es "polimorfismo ido mal" - el operador clase base < < que se llama en lugar del operador de clase derivada. En el ejemplo anterior, ¿cómo hago que se llame al operador correcto para la clase derivada? Y, en términos más generales, si mi clase tiene miembros privados que deseo proteger, ¿cómo puedo corregir la sobrecarga del operador al usar la palabra clave friend?
Funciona a la perfección. Gracias. – andyInCambridge
Creo que esto tiene dos defectos. Un defecto es un gran defecto, y el otro es un defecto menor. Enorme defecto primero ... nunca deberías poner invisiblemente 'endl'. 'endl' obliga a una descarga de flujo, que puede ser un gran problema de rendimiento en algunas circunstancias. Use ''\ n''. Está garantizado que es igual de portable (de hecho, 'endl' se define en términos de salida ''\ n'', y no incurre en gastos indirectos. En segundo lugar, yo haría esto:' return out << "Foo \ n ";' Se siente un poco más limpio. Conceptualmente convierte todo en una larga cadena de operaciones << <<. – Omnifarious
@Omnifarious Nunca pondría 'endl' en una' sobrecarga 'operador <<. Solo estaba siguiendo el código de OP. –