Проблема с этой настройкой заключается в том, что оператор <<, который вы определили выше, является бесплатной функцией, которая не может быть виртуальной (у нее нет объекта-получателя).Чтобы сделать функцию виртуальной, она должна быть определена как член некоторого класса, что здесь проблематично, потому что если вы определите operator << как член класса, то операнды будут в неправильном порядке: </p>
class MyClass {
public:
virtual ostream& operator<< (ostream& out) const;
};
означает, что
MyClass myObject;
cout << myObject;
не будет компилироваться, но
MyClass myObject;
myObject << cout;
будет допустимым.
Чтобы исправить это, вы можете применить Основную теоремупрограммного обеспечения - любая проблема может быть решена путем добавления еще одного слоя косвенности.Вместо того чтобы делать оператор << виртуальным, рассмотрите возможность добавления в класс новой виртуальной функции, которая выглядит следующим образом: </p>
class MyClass {
public:
virtual void print(ostream& where) const;
};
Затем определите оператор << как </p>
ostream& operator<< (ostream& out, const MyClass& mc) {
mc.print(out);
return out;
}
Таким образом,у оператора << свободная функция имеет правильный порядок параметров, но поведение оператора << можно настроить в подклассах. </p>
Надеюсь, это поможет!