Funkcje zaprzyjaźnione we/wy dla klasy pochodnej

0
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?

0

Co, wyrzuca 'Unresolved link' i to wszystko? Jeśli chodzi o kod, to nie widzę poważnych błędów poza brakiem średników kończących definicje klas. Zakładam, że obie pary metod put i get są (jakoś) zdefiniowane.

0
#include<iostream>

using namespace std;

class Base {
    friend ostream& operator<<(ostream&, Base&);
    virtual void print(ostream& os ) {os << "bazowa" << endl;}
};

class Derived: public Base {
    friend ostream& operator<<(ostream&, Derived&);
    virtual void print(ostream& os ) {os << "pochodna" << endl;}
};

ostream& operator<<(ostream& os, Base& base)
{
    base.print(os);
    return os;
}

int main()
{
    Base * b = new Base();
    Base * d = new Derived();
    cout << *b;
    cout << *d;
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1