PO W6

background image

Wykład 6



Funkcje wirtualne



Szablony funkcji

Programowanie obiektowe

1



Szablony funkcji



Szablony klas

background image

Funkcje wirtualne



Polimorfizm jest obsługiwany przez język C++ zarówno na etapie
kompilacji (przeciążanie funkcji i operatorów), jak i na etapie wykonania
(dziedziczenie i funkcje wirtualne)



Funkcja wirtualna to metoda składowa zadeklarowana w klasie bazowej
a zdefiniowana w klasie pochodnej

Programowanie obiektowe

2

a zdefiniowana w klasie pochodnej



Aby utworzyć funkcję wirtualną należy jej deklaracje w klasie bazowej
poprzedzić słowem kluczowym virtual



Zasadę, pozwalającą funkcjom wirtualnym realizować polimorfizm
określamy w skrócie jako „jeden interfejs, wiele metod”



W klasie bazowej ma miejsce definicja intejfejsu; każda definicja funkcji
wirtualnej w klasie pochodnej to implementacja funkcji specyficznych dla
danej klasy pochodnej

background image

Funkcje wirtualne



Przykład (jeden interfejs, dwie metody):
konwersja litrów na galony i temperatury w stopniach Fahrenheita na
stopnie Celsjusza z wykorzystaniem funkcji wirtualnych

Programowanie obiektowe

3

Program 5.1

background image

Funkcje wirtualne



Funkcję wirtualną można wywoływać w „normalny sposób”, tzn.
wykorzystując nazwę obiektu i operator kropki



Do wskazywania obiektów klas pochodnych można wykorzystać wskaźnik
ich klasy bazowej



Wówczas kompilator C++ decyduje o wyborze wersji funkcji na podstawie
typu obiektu wskazywanego przez ten wskaźnik; wybór odbywa się na
etapie wykonania programu

Programowanie obiektowe

4

etapie wykonania programu



Oznacza to, że wskazanie różnych obiektów spowoduje wskazanie różnych
wersji funkcji wirtualnej



Przykład

Program 5.2

background image

Funkcje wirtualne



Atrybut virtual jest dziedziczony



Oznacza to, że bez względu na to, ile razy jest dziedziczona funkcja
wirtualna pozostaje funkcją wirtualną



Przykład

Program 5.3

Programowanie obiektowe

5

Program 5.3

background image

Funkcje wirtualne



Funkcje wirtualne są hierarchiczne



Funkcja zadeklarowana w klasie bazowej jako virtual może być
przesłonięta (tj. przedefiniowana) w klasie pochodnej, ale nie musi być tak
zawsze



Jeśli w klasie pochodnej funkcja wirtualna nie zostanie przesłonięta, wtedy
obiekty tej klasy odwołujące się do takiej funkcji wirtualnej będą
wykorzystywały funkcję zdefiniowana w klasie bazowej

Programowanie obiektowe

6

wykorzystywały funkcję zdefiniowana w klasie bazowej



Przykład

Program 5.4

background image

Szablony (funkcji i klas)



Synonimy: szablon funkcji, funkcja szablonowa, funkcja ogólna



Szablony są jedną z najbardziej wyrafinowanych i najbardziej efektywnych
cech języka C++



Zostały dodane do specyfikacji języka zaledwie kilka lat temu



Dzięki szablonom możliwe jest tworzenie tzw. ogólnych definicji funkcji
i klas



W ogólnych funkcjach lub klasach typ danych, na których operuje funkcja

Programowanie obiektowe

7



W ogólnych funkcjach lub klasach typ danych, na których operuje funkcja
lub klasa jest określany jako parametr



W konsekwencji można stworzyć funkcję lub klasę, przystosowaną do pracy
z kilkoma różnymi typami danych, bez konieczności jawnego
redefiniowania specyfikacji dla poszczególnych typów



Funkcja może być zatem w pewnym stopniu inteligentna: może
samodzielnie dobrać zarówno typ argumentów, jak typ wyniku samej
funkcji!

background image

Szablony funkcji



Funkcję ogólną (szablon funkcji) tworzymy posługując się słowem
kluczowym template

template <class Ttype > typ_zwracany nazwa_funkcji(lista parametrów)

{

// ciało funkcji

}

Programowanie obiektowe

8

}

gdzie:

Ttype – symboliczna nazwa typu danych wykorzystywanych przez
funkcję (podczas wywołania funkcji kompilator zamienia ten typ na
rzeczywisty typ danych)
class - słowo kluczowe konieczne, aby powstał szablon;

Uwaga:

Jeśli parametrów szablonu jest więcej niż jeden, to po przecinku
powtarzamy słowo class i podajemy kolejną nazwę parametru;

background image



Funkcje ogólne są podobne do funkcji przeciążonych, ale podczas pracy
z nimi obowiązuje więcej ograniczeń



W odróżnieniu od funkcji przeciążonej funkcja ogólna musi we wszystkich
wersjach wykonywać te same operacje (tyle, że na zmiennych różnych
typów)



Nazwa szablonu musi być zdefiniowana w zakresie globalnym, czyli na
zewnątrz wszystkich funkcji i klas.

Szablony funkcji

Programowanie obiektowe

9

zewnątrz wszystkich funkcji i klas.



Parametr szablonu musi wystąpić jako typ argumentu funkcji definiowanej
tym szablonem.



Parametrem szablonu funkcji może być typ obiektu czyli nazwa klasy.



Definicja szablonu nie powoduje jeszcze utworzenia funkcji szablonowej.
Zostanie ona utworzona dopiero po wystąpieniu w kodzie nazwy tej funkcji
(wywołaniu). Utworzenie odbędzie się zgodnie z „recepturą” zapisaną w
szablonie.

background image



Nazwa funkcji ogólnej nie powinna pokrywać się z innymi nazwami
zmiennych i funkcji globalnych.



Parametr szablonu – nazwany podczas deklarowania szablonu – nie musi
mieć tej samej nazwy podczas definiowania szablonu.



Dwa szablony o takiej samej nazwie mogą wystąpić w tym samym kodzie;
należy tylko uważać, aby jeden nie był szczególnym przypadkiem drugiego

Szablony funkcji

Programowanie obiektowe

10

należy tylko uważać, aby jeden nie był szczególnym przypadkiem drugiego
(wówczas linker nie wiedziałby, z którego ma skorzystać)

background image



Szablon wstawiając do wzorca funkcji różne typy argumentów realizuje tak
naprawdę przeciążenie nazwy funkcji.



Sam szablon też może być przeciążony czyli w tym samym zakresie
ważności może wystąpić dwa lub kilka razy z tą sama nazwą, ale różnymi
parametrami, np.:

Szablony funkcji

Programowanie obiektowe

11

template <class TypSymb> void funkcja (TypSymb, int);
template <class TypSymb > void funkcja (TypSymb, int, float, char);

background image



Szablon jest deklarowany globalnie, ale stosowany lokalnie; dlatego nie
powinien używać nazw zmiennych globalnych



UWAGA: szablony ciągle są nowością: w różnych środowiskach języka
C++, a szczególnie w zakresie pracy linkerów mogą występować problemy

Szablony funkcji

Programowanie obiektowe

12

C++, a szczególnie w zakresie pracy linkerów mogą występować problemy



W szablonie możemy stosować kwalifikatory inline, extern, static.
Pamiętajmy jednak, że słowo to odnosi się ostatecznie nie do szablonu ale
do funkcji, która wg tego szablonu zostanie zbudowana:



Przykład

template <class bb> inline bb wieksza (bb z1, bb z2)

{

return (z1>z2)? z1:z2;

}

background image

Sortowanie przez zamianę (bąbelkowe)

44

Klucze

pocz

ą

tkowe

55

i = 2

i = 3

i = 5

i = 4

44

06

06

06

K r o k i a l g o r y t m u

12

12

06

12

06

12

i = 6

06

12

i = 7

06

12

i = 8

Programowanie obiektowe

13

42

18

06

94

67

12

42

18

94

67

12

55

55

18

94

42

67

44

44

55

42

18

67

94

44

55

42

18

67

94

44

55

42

18

67

94

44

55

42

18

67

94

44

55

42

18

67

94

background image

Szablony funkcji



Funkcje ogólne (szablony funkcji) są bardzo użyteczne



Można je stosować w tych sytuacjach, kiedy różne funkcje wykorzystują
ten sam ogólny algorytm

Programowanie obiektowe

14



Przykład: funkcja ogólna, realizująca sortowanie bąbelkowe

Program 5.5

background image

Szablony klas



Oprócz funkcji ogólnych (szablonów funkcji) w języku C++ można także
definiować szablony klas (klasy ogólne)



W takim przypadku tworzona klasa zawiera definicje wszystkich
wykorzystywanych przez nią algorytmów, jednak typ danych, na których

Programowanie obiektowe

15

wykorzystywanych przez nią algorytmów, jednak typ danych, na których
klasa operuje, zostanie przekazany do niej jako parametr dopiero w chwili
tworzenia obiektów

background image

Szablony klas



Ogólna składnia szablonu klasy:

template <class Ttype > class nazwa_klasy

{

// ciało klasy

}

Programowanie obiektowe

16

gdzie Ttype oznacza nazwę typu, który zostanie określony podczas tworzenia

obiektu (egzemplarza klasy)



Można zdefiniować więcej niż jeden typ ogólny: wówczas kolejne typy są
oddzielane od siebie przecinkami trzeba powtarzać słowo class);



Po utworzeniu klasy ogólnej można stworzyć obiekt (egzemplarz klasy),
posługując się składnią:

nazwa_klasy <typ_rzeczywisty> nazwa_obiektu;

background image

Szablony klas



Przykład 1: szablon klasy: stos ogólny



Przykład 2: szablon klasy z dwoma typami ogólnymi

Program 5.6

Programowanie obiektowe

17



Przykład 2: szablon klasy z dwoma typami ogólnymi

Program 5.7

background image

Szablony klas



Przeciążanie operatora []

Program 5.8

Program 5.9

Programowanie obiektowe

18



Przykład 3: szablon klasy: ogólna, bezpieczna tablica

Program 5.10

background image

Szablony klas



W szablonach klas można posługiwać się także argumentami, które nie
służą do określenia typu



Składnia szablonu, w przypadku użycia takiego parametru nie ulega zmianie

Programowanie obiektowe

19

Program 5.11

background image

Szablony klas



W szablonach klas można definiować argumenty domyślne, związane z
typem ogólnym, np.

template <class X=int> class MojaKlasa( ...



Dopuszcza się także definiowanie wartości domyślnych dla argumentów nie
służących do określania typu



Wartość domyślna jest wykorzystywana wtedy, gdy podczas tworzenia
obiektu (egzemplarza klasy) żadna wartość nie zostanie wyspecyfikowana w

Programowanie obiektowe

20

obiektu (egzemplarza klasy) żadna wartość nie zostanie wyspecyfikowana w
sposób jawny



Wartości domyślne dla argumentów nie służących do określania typu
definiuje się w taki sam sposób, jak dla standardowych argumentów funkcji



Przykład

Program 5.12

background image

Programowanie obiektowe

21


Wyszukiwarka

Podobne podstrony:
PO W6
PO w6
PO W6
W6 Technika harmonogramów i CPM
PO wyk07 v1
w6 Czołowe przekładanie walcowe o zebach srubowych
Rehabilitacja po endoprotezoplastyce stawu biodrowego
Systemy walutowe po II wojnie światowej
HTZ po 65 roku życia
Zaburzenia wodno elektrolitowe po przedawkowaniu alkoholu
Organy po TL 2
Metoda z wyboru usprawniania pacjentów po udarach mózgu
03Operacje bankowe po rednicz ce 1
AM1 W6
Piramida zdrowia po niemiecku

więcej podobnych podstron