Funkcje wirtualne
Sz
S ablo
l ny
y f
u
f nkcjij
Szablony klas
Programowanie obiektowe
1
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
a z
d
z ef
e in
i io
i wan
a a
a w
kla
l s
a ie
i
e p
och
c odnej
e
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
Programowanie obiektowe
2
Przykład (jeden interfejs, dwie metody): konwersja litrów na galony i temperatury w stopniach Fahrenheita na stopnie Celsjusza z wykorzystaniem funkcji wirtualnych Program 5.1
Programowanie obiektowe
3
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 et
e a
t p
a ie
i
e w
yk
y onan
a ia
i
a p
rogram
a u
m
Oznacza to, że wskazanie różnych obiektów spowoduje wskazanie różnych wersji funkcji wirtualnej
Przykład
Program 5.2
Programowanie obiektowe
4
Atrybut virtual jest dziedziczony
Oznacza to, że bez względu na to, ile razy jest dziedziczona funkcja wirtualna pozostaje funkcją wirtualną
Przykład
Progr
r
am 5.
3
Programowanie obiektowe
5
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ą wyk
y orzy
z s
y ty
t w
y ał
a y
ł
y f
unkcj
c ę
ę z
d
z ef
e in
i io
i wan
a a
a w
k
la
l s
a ie
i
e b
az
a o
z wej
e
Przykład
Program 5.4
Programowanie obiektowe
6
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
W o
góln
l yc
y h
c f
unkcj
c ac
a h
c l
u
l b k
la
l s
a ac
a h
c t
y
t p
y d
an
a yc
y h
c , n
a
a k
tó
t ryc
y h
c o
per
e uje
e f
unkcj
c a
a
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!
Programowanie obiektowe
7
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
}
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; Programowanie obiektowe
8
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 ze
z w
e nąt
ą r
t z wszy
z s
y tk
t ic
i h
c funkcj
c i i kla
l s
a .
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.
Programowanie obiektowe
9
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; nal
a e
l ż
e y
ż ty
t l
y k
l o
k uw
u aż
a a
ż ć
a ,
ć ab
a y jed
e e
d n
e nie
i był
y szc
z z
c e
z g
e ól
ó n
l ym
y
przy
z p
y a
p d
a ki
k e
i m
e
drug
u ie
i g
e o
g
(wówczas linker nie wiedziałby, z którego ma skorzystać) Programowanie obiektowe
10
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.:
template <class TypSymb> void funkcja (TypSymb, int); template <class TypSymb > void funkcja (TypSymb, int, float, char); Programowanie obiektowe
11
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+
C +
+ ,
+ a szc
z z
c e
z g
e óln
l ie
i w za
z k
a res
e ie
i prac
a y
c li
l n
i ker
e ów mo
m gą wys
y tę
t p
ę ować
a proble
l m
e y
m
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;
}
Programowanie obiektowe
12
Sortowanie przez zamianę (bąbelkowe) K r o k i a l g o r y t m u
Klucze
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
początkowe
44
06
06
06
06
06
06
06
55
44
12
12
12
12
12
12
12
55
44
18
18
18
18
18
42
12
55
44
42
42
42
42
94
42
18
55
44
44
44
44
18
94
42
42
55
55
55
55
06
18
94
67
67
67
67
67
67
67
67
94
94
94
94
94
Programowanie obiektowe
13
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
Przykład: funkcja ogólna, realizująca sortowanie bąbelkowe Program 5.5
Programowanie obiektowe
14
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 wyk
y orzy
z s
y ty
t w
y an
a yc
y h
c p
rze
z z
e
z n
ią
i
ą a
l
a g
l oryt
y m
t ó
m w,
w j
ed
e nak
a t
y
t p
y dan
a yc
y h
c , n
a
a k
tó
t ryc
y h
c
klasa operuje, zostanie przekazany do niej jako parametr dopiero w chwili tworzenia obiektów
Programowanie obiektowe
15
Ogólna składnia szablonu klasy:
template <class Ttype > class nazwa_klasy
{
// ciało klasy
}
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;
Programowanie obiektowe
16
Przykład 1: szablon klasy: stos ogólny
Program 5.6
Przy
z k
y ła
ł d
a 2
:
: s
za
z b
a lo
l n k
la
l s
a y
y z
z dwoma
m
a t
y
t p
y am
a i
m
i ogóln
l ym
y i
m
Program 5.7
Programowanie obiektowe
17
Przeciążanie operatora []
Program 5.8
Program 5.9
Przykład 3: szablon klasy: ogólna, bezpieczna tablica Program 5.10
Programowanie obiektowe
18
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 Program 5.11
Programowanie obiektowe
19
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 obie
i k
e tu
t (
eg
e ze
z m
e p
m la
l r
a za
z
a k
la
l s
a y)
y ż
a
ż d
a na
a w
ar
a to
t ść
ć n
ie
i
e z
o
z sta
t n
a ie
i
e w
ys
y pec
e y
c f
y ik
i owan
a a
a 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
Programowanie obiektowe
20
21