Pakiet programów do zdalnego nauczania Programowania Orientowanego Obiektowo
Dzisiaj jest
Środa, 18 Lipiec 2018
Zarejestrowanych użytkowników: 4
Dostępnych pytań testowych: 102
HOME
Strona tytułowa pracy dyplomowej
NAUKA
Materiały dydaktyczne związane z OOP
TESTY
Sprawdzenie poziomu zdobytej wiedzy
ZASOBY
Literatura i zasoby sieciowe o OOP
ŹRÓDŁA
Zbiór projektów dydaktycznych z OOP
KONTO
Możliwość śledzenia własnych postępów
INFO



Kowariancja typów zwracanych

Podczas implementacji metody klonuj() w klasie Obiekt i jej podklasach można było zaobserwować, iż typ zwracany nie jest zawsze taki sam. Dla klasy Obiekt był on zdefiniowany jako:

virtual Obiekt * klonuj () const = 0;

Natomiast w klasie RegulatorPID deklaracja wygląda następująco:

virtual RegulatorPID * klonuj () const;

Generalnie istnieje zasada, że metody przesłaniane w klasie pochodnej muszą być zgodnego typu. Istnieje jednak wyjątek od tej zasady. Jeśli w klasie bazowej metoda wirtualna zwraca wskaźnik na typ A, to w klasie pochodnej metoda wirtualna może zwrócić wskaźnik na typ B pod warunkiem, że B dziedziczy publicznie po A. Wspomniana zasady tyczy się również referencji.

W konkretnym przypadku przedstawionym powyżej - ponieważ RegulatorPID dziedziczy po klasie Obiekt można zastosować kowariancję typów zwracanych.

Czy w przedstawionym przykładzie zastosowanie kowariancji typów zwracanych jest niezbędne? Klasa Petla korzysta tylko ze wskaźników na klasę Obiekt, więc wartość zwrotna metody klonuj() jest automatycznie rzutowana w górę hierarchii.

Jednak nie zawsze musi tak być. Inne klasy mogą korzystać z bardziej konkretnego typu, nie zawsze typu ogólnego (szczególnie w bardziej rozbudowanych hierarchiach dziedziczenia niż ta przedstawiona w przykładzie). Jeśli nie zastosowano by wtedy kowariancji typów zwracanych to po wywołaniu metody klonuj() uzyskany wskaźnik trzeba byłoby jawnie rzutować w dół hierarchii dziedziczenia za pomocą operatora dynamic_cast<T>.

Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11