Вкладчик потока принимает поток в качестве первого аргумента, поэтому, когда вставщик является функцией-членом, он является членом класса потока, а не класса, который вы пишете.Так что это не может быть виртуальной функцией в вашем классе.Но он может вызвать виртуальную функцию в вашем классе.
class my_class {
virtual std::ostream& put(std::ostream& out) const {
out << "here we go!\b";
}
friend std::ostream& operator<<(std::ostream& out, const my_class& my_object);
};
std::ostream& operator<<(std::ostream& out, const my_class& my_object) {
my_object.put(out);
}