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 inlineexternstatic.
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