Przeładowana funkcja i referencje do klasy i jej pochodnych jako parametry

0

Witam,
jeśli ten problem już pojawił się na forum to przepraszam za robienie szumu :)
Problem mam następujący: w programie mam dwie klasy, podstawowa A i pochodna od niej klasa B (dziedziczona publicznie). Mam też dwie globalne funkcje operatorowe:

istream& operator>>(istream& istr, A &foo) //zaprzyjaźniona z klasą A, nazywajmy ją funkcja1
istream& operator>>(istream& istr, B &bar) //zaprzyjaźniona z klasą B, nazywajmy ją funkcja2

Ich zadaniem jest wczytywanie danych ze strumienia do obiektów tych klas.

Gdzie pojawia się problem:
Tworzę obiekt klasy B i chcę coś do niego wczytać:

B costam;
jakisstrumien>>costam;

W swoim kodzie funkcja2 wywołuje funkcję1 w ten sposób:
operator>>(istr, bar);
...tu wczytywanie reszty pól...
W tym momencie kończą mi się pomysły. Jak spowodować, żeby wywołała się funkcja1 zamiast funkcji2 w tym przypadku? Kompilator ostrzega mnie:

warning C4717: 'operator>>' : recursive on all control paths, function will cause runtime stack overflow

Rzutowanie bar na typ A odpada, bo wtedy dane nie są wczytywane - tak jakby to rzutowanie powodowało przekazanie parametru do funkcji1 przez wartość, a nie referencję. Ktoś ma na to pomysł?
(Wiem, sama koncepcja takiego programu jest zła, no ale to siła wyższa, tak ma działać ten program i nie ode mnie to zależy).

0
sart napisał(a)

W swoim kodzie funkcja2 wywołuje funkcję1 w ten sposób:
operator>>(istr, bar);

Nie. Wywołujesz rekurencyjnie funkcję w ktorej już jesteś. Funkcje globalne o tej samej nazwie rozróżniane są tylko na podstawie argumentów, tyczy się to także operatorów.
Rozwiązanie jest proste i wystarczy "bar" rzutować na referencję do A:
operator>>(istr, (A&)bar);
Cały czas przekazywany jest ten sam obiekt; można sprawdzić na adresach.

0

Wiem, że to wywołanie jest rekurencyjne, z komunikatu kompilatora się domyśliłem. Co do problemu - rozwiązałem to tak:

A *ptr=&bar;
operator>>(jakisstrumien, *ptr);

i działa. Sposób zaproponowany przez Ciebie również działa, w sumie oba są niemal identyczne.
Dziękuję za odzew ;)

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