Virtual Friend Function Idiom даёт чистое решение для реализации полиморфного вывода в иерархии классов. Этот подход объединяет публичный friend-оператор с защищённой виртуальной функцией, чтобы добиться динамического связывания.
Решение использует два ключевых компонента:
friend operator<<, который служит точкой входа для выводаprintOn(), которую каждый класс переопределяет со своей логикой выводаclass Base {
public:
friend std::ostream& operator<< (std::ostream& o, const Base& b);
protected:
virtual void printOn(std::ostream& o) const;
};
inline std::ostream& operator<< (std::ostream& o, const Base& b) {
b.printOn(o);
return o;
}
Каждый производный класс должен только переопределить метод printOn():
class Derived : public Base {
protected:
virtual void printOn(std::ostream& o) const;
};
Производные классы не предоставляют собственную перегрузку operator<<. Полиморфное поведение автоматически обеспечивается через виртуальную функцию printOn().
operator<< является friend-функцией<<printOn() как чисто виртуальную функцию с синтаксисом = 0Этот идиом элегантно решает проблему того, что operator<< не может быть объявлен виртуальным, оставаясь при этом понятным и удобным в поддержке.
Дружественный friend operator<< должен быть объявлен как virtual для достижения динамического связывания в иерархии классов.
Новый — ещё не проверен сообществом
Вы