Nie możesz tak zrobić, uszy nie są częścią klasy zwierze, a Ty próbujesz się do nich dobrać.
Chorobcia zapomniałem to usunąć. Był późny wieczór i sprawdzałem "co się stanie gdy". Wiem o tym, to wskaźnik, który pokazuje na klasę "zwierze", a w niej nie zadeklarowałem składników prywatnych z trzech powodów:
1. Chcę aby klasa zwierze była tylko abstrakcyjna. W sumie chciałbym dzięki wskaźnikowi jej typu używać funkcji wirtualnych we wszystkich klasach potomnych.
2. Z tego co kiedyś czytałem, to prywatnych składników się nie dziedziczy z klasy abstrakcyjnej (tylko publiczne)...czy mam rację?
3. Nigdy nie powstanie obiekt klasy zwierze wiec ostatecznie nie są do niczego potrzebne.
Jeśli dałeś te metody do klasy bazowej, to dlaczego nie zrobisz też metod getEars(), getEyes(), getFur()?
Liczne przykłady, które czytałem w internecie pokazują taką praktykę. Ja z niej zrezygnowałem dlatego, że chciałem aby była jedna metoda do odczytywania wartości z pól prywatnych typu
string. Dlatego nazwałem ją "wyjmijstring". Jeśli zechciałbym stworzyć 48 pól tego typu to przy pomocy jednej funkcji mógłbym je odczytywać i przekazywać poza klasę, np.: do obiektu UnicodeString temp1. Taki był mój zamysł tworzenia tej metody. Gdy pojawi się potrzeba stworzenia 19 pól typu float, to stworzyłbym czysto wirtualną metodę "wyjmijfloat" i utworzyłbym ją w klasie kot.
Te pytania mają skłonić Cię do zastanowienia się nad hierarchią dziedziczenia i nad tym, co w danej klasie powinno się znaleźć, bo według mnie nie do końca wiesz, co chcesz zrobić.
Tak faktycznie, wygląda to trochę chaotycznie. Jak już wspomniałem wyżej, stworzyłem te dwie klasy i ich przykładowe(mega prymitywne) pola tylko po to aby zobaczyć mechanizm współpracy klas abstrakcyjnych z klasami z nich dziedziczącymi. Zobaczyć jak polimorficzny wskaźnik uruchamia metody wirtualne w klasach dziedziczących od abstrakcyjnej. Czy to działa w tym XE2 i czego się spodziewać.
Chciałbym ten mechanizm wykorzystać w większym projekcie i na potrzeby treningu utworzyłem klasy: zwierze i kot. Doskonale zdaję sobie sprawę z konsekwencji dołączenia do tej hierarchii klas: ryba czy krokodyl...bo to też są zwierzęta. Mają zupełnie inne cechy. Zwierze i kot nie ulegną rozwojowi w najbliższej przyszłości ani też hierarchia nie ulegnie większemu rozwojowi. Przy pomocy tych dwóch klas chcę zobaczyć na własne oczy jak działa polimorfizm...na takim bardzo ubogim przykładzie.
Ogólnie wiem jak wygląda ten mechanizm:
1. tworzę klasę abstrakcyjną zwierze, jej metody czysto wirtualne oraz publiczne metody na potrzebę dziedziczenia dla klasy kot.
2. tworzę klasę kot i deklaruję i definiuję virtualne metody oraz deklaruję/definiuję pola prywatne i metody, które wyjmą z nich dane poza klasę - patrz "wyjmijstring()"
3. gdy klasy są gotowe to:
- tworzę wskaźnik polimorficzny na klasę abstrakcyjną "zwierze":
- tworzę obiekt klasy "kot":
- ustawiam wskaźnik i mogę korzystać z dobrodziejstw wskaźnika polimorficznego:
wskaz = &dachowiec;
wskaz->losuj_uszy();
wskaz->losuj_futro();
- teraz chcę wyjąć to co wylosowałem:
UnicodeString temp = wskaz->wyjmijstring(dachowiec.uszy)
...No i to mi nie działa.
Gdy stworzę (tak zupełnie dla przykładu) następnego futrzaka, np.: pies. Będzie on miał ten sam zestaw pól i w pies.h zadeklaruję: class pies : public zwierze, to chcę ponownie użyć:
pies burek;
wskaz = &burek;
UnicodeString temp = wskaz->wyjmijstring(burek.uszy)
Dziękuję Ci za cierpliwość wiem, że możesz mi pomóc bo nawet Twój nick na forum za tym przemawia.
Jutro muszę wyjechać na kilka dni i nie będę mógł korzystać z pryw. komputera. Odsapnij ode mnie
