class Kaczor
{
friend ostream & operator<<(ostream & wy, Kaczor & obiekt);
friend istream & operator>>(istream & we, Kaczor & obiekt);
}
class Donald : public Kaczor
{
friend ostream & operator<<(ostream & wy, Donald & obiekt);
friend istream & operator>>(istream & we, Donald & obiekt);
}
Kaczor* obiekt = new Donald; //wskaźnik ma typ klasy bazowej, ale wskazuje na potomną
plik << *obiekt; //zapis do pliku
Niestety, w tym miejscu C++ wywołuje zaprzyjaźnioną funkcję operatorową dla klasy bazowej Kaczor. Chcę, aby wywołały się funkcje operatorowe dla klasy pochodnej Donald. Nie da się nadać funkcjom atrybutu virtual, bo nie są członkami klas. Próbowałem to obejść:
class Kaczor
{
friend ostream & operator<<(ostream & wy, Kaczor & obiekt);
friend istream & operator>>(istream & we, Kaczor & obiekt);
public: virtual istream & put(istream & we);
public: virtual ostream & get(ostream & wy);
}
class Donald : public Kaczor
{
friend ostream & operator<<(ostream & wy, Donald & obiekt);
friend istream & operator>>(istream & we, Donald & obiekt);
public: virtual istream & put(istream & we);
public: virtual ostream & get(ostream & wy);
}
ostream & operator<<(ostream & wy, Donald & obiekt)
{
return obiekt.get(wy); //podobnie dla >> w obu klasach
}
Niestety, kompilator Microsoftu wyrzuca błąd Unresolved link.
Jak odwołać się do funkcji zaprzyjaźnionych wejścia/wyjścia dla klasy pochodnej, kiedy używamy operatora << lub >> przy odczycie i zapisie do pliku?