Funkcje wirtualne, dziedziczenie wielokrotne

Nasza ocena:

4
Pobrań: 14
Wyświetleń: 833
Komentarze: 0
Notatek.pl

Pobierz ten dokument za darmo

Podgląd dokumentu
Funkcje wirtualne, dziedziczenie wielokrotne - strona 1

Fragment notatki:


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)

Zaloguj się, aby dodać komentarz