Чтобы получить Base
часть d
, вам необходимо привести к Base&
.
. То, что вы получите с вашим кастом, является временным Base
объектом, который нельзя передать какнеконстантный ссылочный аргумент.
Обратите внимание, что это приведение все равно не заставит все работать так, как вы ожидаете - например,
Derived d;
Base &b = d;
std::cin >> b;
будет использовать перегрузку Base&
, так как перегрузкаоснован на статическом типе b
.
Обычный способ перегрузки >>
(и <<
) для иерархии - это иметь только одну перегрузку, которая просто делегирует виртуальную функцию-член.
Затем вы можете переопределить функцию-член в производных классах и позволить динамической диспетчеризации позаботиться о выборе соответствующей функции.
struct Base
{
virtual void read(std::istream& is) { ... }
};
std::istream& operator>> (std::istream &in, Base &b)
{
b.read(in);
return in;
}
struct Derived: Base
{
void read(std::istream& is) override { Base::read(is); ... }
};