Как я могу перегрузить оператор как виртуальный - PullRequest
2 голосов
/ 18 октября 2019

У меня есть простая структура наследования:

  • База <- Derived1 </li>
  • База <- Derived2 </li>

Я хочу перегрузить << и>> операторы для ввода и печати данных в классах объектов Derived1 и Derived2 в качестве ссылки на класс Base.

Могу ли я объявить некоторые виртуальные функции? Например:

virtual std::ostream& operator<<(std::ostream& os, const Base& obj) = 0;
virtual std::istream& operator>>(std::istream& is, Base& obj) = 0;

в моем классе Base и переопределить их в классах Derived1 и Derived2?

Я хочу сделать что-то подобное:

std::vector<Base&> a;
... push reference to Derived1 and Derived2 objects ...
for (auto i = a.begin(); i != a.end(); ++i) std::cin >> (*i);
for (auto i = a.begin(); i != a.end(); ++i) std::cout << (*i);

1 Ответ

5 голосов
/ 18 октября 2019

Только функции-члены могут быть виртуальными, но эти operator<< и operator>> не могут быть функциями-членами вашего класса, поскольку их первый аргумент - поток, а не класс, перегружающий эти операторы.

Вы можетеПерегрузите функции адаптера operator<< и operator>> для вашего класса, которые перенаправляют вызов в соответствующие виртуальные функции вашего класса (2-й аргумент):

#include <iostream>

struct Base {
    virtual std::ostream& output(std::ostream&) const = 0;
    virtual std::istream& input(std::istream&) = 0;
    virtual ~Base() = default;
};

inline std::ostream& operator<<(std::ostream& os, const Base& obj) { return obj.output(os); }
inline std::istream& operator>>(std::istream& is, Base& obj) { return obj.input(is); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...