Nie możesz stworzyć operatora << jako metody wirtualnej, gdyż sam zapis
std::cout << obiekt;
to uniemożliwia. W tym przypadku możliwa jest jedynie funkcja pobierająca dwa argumenty: jeden zwyczajowo std::ostream, drugi zaś to polimorficzna referencja. Zobacz przykład.
#include <iostream>
struct B
{
B(int i) : b(i) {}
virtual void print() const = 0;
int b;
};
struct C : B
{
C(int i) : B(i + 1), a(i) {}
void print() const
{
std::cout << "Obiekt klasy C: " << a << ' ' << b << '\n';
}
int a;
};
std::ostream& operator<<(std::ostream& os, const B& obj)
{
obj.print();
return os;
}
int main()
{
C obj1(10), obj2(20), obj3(30);
std::cout << obj1 << obj2 << obj3;
/* lub
obj1.print();
obj2.print();
obj3.print();
*/
B* wsk = &obj2;
std::cout << *wsk;
}