Haciendo operador << virtual?

Necesito usar un operador virtual <<. Sin embargo, cuando intento escribir:

virtual friend ostream & operator<<(ostream& os,const Advertising& add); 

Me sale el error del comstackdor

Error 1 error C2575: ‘operador <<': solo las funciones y bases de miembros pueden ser virtuales

¿Cómo puedo activar este operador virtual?

El problema con esta configuración es que el operador < < que definió anteriormente es una función gratuita, que no puede ser virtual (no tiene ningún objeto receptor). Para hacer que la función sea virtual, debe definirse como un miembro de alguna clase, lo cual es problemático aquí porque si defines operator << como miembro de una clase, entonces los operandos estarán en el orden incorrecto:

 class MyClass { public: virtual ostream& operator< < (ostream& out) const; }; 

significa que

 MyClass myObject; cout < < myObject; 

no comstackrá, pero

 MyClass myObject; myObject < < cout; 

será legal

Para solucionar esto, puede aplicar el Teorema Fundamental de Ingeniería de Software: cualquier problema puede resolverse agregando otra capa de indirección. En lugar de hacer que el operador sea < < virtual, considere agregar una nueva función virtual a la clase que se ve así:

 class MyClass { public: virtual void print(ostream& where) const; }; 

Luego, defina el operador < < como

 ostream& operator< < (ostream& out, const MyClass& mc) { mc.print(out); return out; } 

De esta forma, la función < < del operador libre tiene el orden de parámetros correcto, pero el comportamiento del operador << se puede personalizar en subclases.

¡Espero que esto ayude!

Usted define su operador < < para llamar a un método de impresión virtual:

 class Base { protected: virtual void print(std::ostream& str) const = 0; public: friend std::ostream& operator< <(std::ostream& str, Base const& data) { data.print(str); return str; } } 

Parece que realmente desea proporcionar funcionalidad de salida para una jerarquía de clases, y si es así, puede proporcionarle a un friend operator < < que llame a una función virtual .

 class Parent { public: friend std::ostream& operator< < (std::ostream& os, const Parent& p); // ... other class stuff protected: virtual void printMyself(std::ostream& os) const { // do something if you must, or make this a pure virtual } }; std::ostream& operator<< (std::ostream& os, const Parent& p) { p.printMyself(os); return os; } class Child : public Parent { // other class stuff... protected: virtual void printMyself(std::ostream os) const { // whatever you need to do } }; 

También se detalla en las preguntas frecuentes de C ++