To tylko jedna z 36 stron tej notatki. Zaloguj się aby zobaczyć ten dokument.
Zobacz
całą notatkę
Funkcje wirtualne, dziedziczenie wielokrotne Wykład 7 08/12/01 2 Konwersje standardowe przy dziedziczeniu Wskaźnik lub referencja do obiektu klasy pochodnej może być niejawnie przekształcony na wskaźnik (referencję) dostępnej jednoznacznie klasy podstawowej (tylko przy dziedziczeniu publicznym) Konwersje zachodzą Przy przesyłaniu argumentów do funkcji – funkcja która powinna otrzymać wskaźnik (referencję) do obiekty klasy podstawowej może otrzymać wskaźnik (referencję) do obiekty klasy pochodnej Przy zwracaniu przez funkcję rezultatu - funkcja, która powinna zwrócić wskaźnik (referencję) do obiektu klasy podstawowej może zwrócić wskaźnik (referencję) do klasy pochodnej 08/12/01 3 Konwersje standardowe przy dziedziczeniu... Konwersje zachodzą… Przy przeładowanych operatorach – analogicznie jak w przypadku funkcji W wyrażeniach inicjalizujących – do konstruktora kopiującego spodziewającego się referencji do obiektu klasy podstawowej można wysłać referencję do obiektu klasy pochodnej Obiekty klas pochodnych mogą być traktowane jak obiekty swych klas podstawowych tylko wtedy, gdy pracujemy na ich adresach (referencjach) UWAGA: Do funkcji spodziewającej się adresu tablicy obiektów klasy podstawowej nie można wysłać adresu tablicy obiektów klasy pochodnej Przykład cpp_7.1 08/12/01 4 Funkcje wirtualne Dopiero przy funkcjach wirtualnych pojawia się możliwość faktycznego programowania (z)orientowanego obiektowo Realizacja klas podstawowych i pochodnych w zasadzie jest taka sama ale Pojawia się słowo virtual przy nazwach funkcji składowych (niekoniecznie wszystkich), które umożliwia wykonywanie różnych funkcji w zależności od typu obiektu na rzecz, którego chcemy taką funkcję wywołać Wykorzystanie funkcji wirtualnych może w znakomity sposób ułatwić i uprościć nam pracę na projektem 08/12/01 5 Posługiwanie się funkcjami wirtualnymi Możliwe jest ustawienie wskaźnika (referencji) typu klasy podstawowej tak, żeby pokazywał na obiekt klasy pochodnej Wynika to z uogólnienia tzn. klasa pochodna jest szczególnym (bardziej wyspecjalizowanym) typem klasy podstawowej Np. mając wskaźnik do pojazdów możemy nim pokazywać na samochód lub nawet na „malucha” i nie jest to niezgodne z naszym wyobrażeniem o rzeczywistości (samochód jest rodzajem pojazdu) Sytuacja odwrotna nie jest już prawdziwa Np. mając wskaźnik do samochodu nie możemy nim (w ogólności) pokazywać na pojazd, gdyż pojazdem może np.
(…)
… z polimorfizmu
Program jest rozszerzalny o nowe obiekty (typy), a ich
dodanie nie wymaga zmian w już istniejącym kodzie
Jednak są również wady
W szczególności w miejscach, gdzie decyduje się jakiej klasy
jest obiekt pokazywany przez wskaźnik lub nazywany
referencją
Nie wymaga instrukcji wyboru
„Inteligentne” zachowanie kompilatora w stosunku do funkcji
wirtualnych okupione jest dłuższym…
… to taka klasa, która nie
reprezentuje żadnego konkretnego obiektu
Np. pojazd, figura geometryczna itp...
Takie klasy tworzy się, aby po nich dziedziczyć
W pewnym sensie są to niedokończone klasy
Tworzymy funkcje wirtualne, których będziemy
używać, ale implementacje tych funkcji
pozostawiamy klasom pochodnym
08/12/01
Np. w klasie figura, powinna znaleźć się funkcja rysuj,
mimo iż jeszcze nie wiadomo…
…() – zwraca nazwę klasy (dokładna postać zależy
od implementacji)
Operatory == i != pozwalające na porównanie dwóch typów
Przykład cpp_7.9
08/12/01
17
Mechanizm RTTI i projektowanie
klas
Mechanizm RTTI należy używać z rozwagą (w
szczególności typeid)
Na pewno nie należy używać instrukcji warunkowych, w
których typeid służy do określania jaką funkcję wywołać
Używanie tego mechanizmu sprzyja…
…
08/12/01
30
Kiedy dziedziczyć, a kiedy osadzać
składniki (klasy)
Dziedziczenie wybieramy w sytuacji kiedy dany
obiekt jest rodzajem innego
Zawieranie obiektów składowych używamy w
sytuacji, gdy jeden obiekt składa się z innych
obiektów
Np. kwadrat jest rodzajem figury geometrycznej,
samochód jest rodzajem pojazdu
Np. samochód składa się (miedzy innymi) z czterech kół,
radio składa…
… kompilacji wiadomo dokładnie, która
wersja funkcji ma zostać wywołana
Wywołanie na rzecz obiektu (obiekt.funkcja())
Jawne użycie kwalifikatora zakresu (wskaźnik->klasa::funkcja())
08/12/01
Należy stosować jeżeli sięgamy do składników klasy podstawowej z funkcji
składowych klasy pochodnej
Wywołanie funkcji z konstruktora lub destruktora klasy podstawowej
9
Klasy abstrakcyjne
Klasa abstrakcyjna…
... zobacz całą notatkę
Komentarze użytkowników (0)