Ответы до сих пор имеют правильную идею, но прежде чем вы запустите и реализуете его, сделайте два изменения:
- Использовать ostream, а не ofstream
- Функция печати должна быть постоянной.
Таким образом:
class Event
{
public:
virtual ~Event();
virtual std::ostream& printTo( std::ostream& ) const /*= 0*/;
// other public methods
};
/*inline*/ std::ostream& operator<<(std::ostream& os, const Event& event)
{
return event.printTo(os);
}
Пока print (или printTo) общедоступны, нет необходимости заставлять оператора потока перегружать друга.
У вас есть возможность иметь реализацию по умолчанию или сделать метод печати чисто виртуальным.
Вы также можете сделать print()
общедоступной не виртуальной функцией, которая вызывает защищенную или приватную виртуальную функцию, как в случае со всеми виртуальными функциями.