Перегрузка операторов << и >> для базового класса и класса наследника

156
27 февраля 2022, 20:00
Base* b = new Derived();

Base - наследник Derived(). Если у обоих этих классов есть функция print(), и мы заходим ее вызвать от *b, то вызовется функция определенная для Base, хотя мне нужна функция класса наследника. Я знаю, что такое можно починить сделав print() в Base виртуальной и написав override у функции наследника, однако если я собираюсь перегрузить operator<< для обоих классов, то этот способ использовать не получится, какие есть варианты справится с этой проблемой?

Answer 1

Например, ваш оператор << вполне может вызывать виртуальную функцию print, правда? :)

struct Base
{
    virtual void print(ostream&os) const { os << "Base\n"; }
};
struct Derived: public Base
{
    void print(ostream&os) const override { os << "Derived\n"; }
};
ostream& operator << (ostream& os, Base& b)
{
    b.print(os);
    return os;
}

int main(int argc, const char * argv[])
{
    Base* a = new Base();
    Base* b = new Derived();
    Base c;
    Derived d;
    cout << *a << *b;
    cout << c << d;
}
READ ALSO
Как правильно создавать функции?

Как правильно создавать функции?

Работая со старым кодом, столкнулся с интересным стилем

100
перевод каждого элемента стринг в инт

перевод каждого элемента стринг в инт

что нужно написать в цикле чтобы перевести каждый элемент стринга в инт и прибавить его в 'c'

86
Удаление пробелов из строки

Удаление пробелов из строки

Как удалить все пробелы из строки

82
Вывести совпадения Laravel + MySql

Вывести совпадения Laravel + MySql

Как вывести совпадения для пользователя -user_i = 1Нужно вывести пользователей, которых лайкнул пользователь 1 и те пользователя, которые лайкнули...

89