Linki |
» Dzieci to nie książeczki do kolorowania. Nie da siÄ™ wypeÅ‚nić ich naszymi ulubionymi kolorami. » 139rozwi¹zania umowy, niezachowanie formy pisemnej, niezachowanie terminu, w którym mo¿e nast¹piæ rozwi¹zanie, jak i rozwi¹zanie umowy bez zachowania wymaganego... » Kiedy Mick Jagger koñczy³ 50 lat, nie robi³o tu ju¿ mo¿e takiego wra¿enia, jak owe pamiêtne urodziny, kiedy koñczy³ 30 - ale to tylko z tego powodu, ¿e by³ czas, kiedy... » · Automatyczne uleganie autorytetom oznaczać może uleganie jedynie symbolom czy oznakom autorytetu, nie zaÅ› jego istocie... » Jedynym roszczeniem przys³uguj¹cym pracownikowi pozbawionemu pracy wskutek odwo³ania ze stanowiska mo¿e byæ roszczenie o odszkodowanie, je¿eli odwo³anie... » gatunku mo¿e byæ zap³acona jedynie cena œciœle okreœlona (cenasztywna), cena ta wi¹¿e strony bez wzglêdu na to, jak¹ cenê wumowie ustali³y... » Protokół TCP zapewnia poÅ‚Ä…czeniowÄ… transmisjÄ™ danych pomiÄ™dzy dwoma lub wiÄ™cej hostami, może obsÅ‚ugiwać wiele strumieni danych,
umożliwia... » Pozycja Moje bieżące dokumenty może być przydatna, ponieważ udostÄ™pnia podmenu zawierajÄ…ce listÄ™ 15 ostatnio otwartych dokumentów... » Nikt nie mo¿e ponosiæ ujemnych nastêpstw z powodu przynale¿noœci do zwi¹zku zawodowego, pozostawania poza nim albo wykonywania funkcji zwi¹zkowej... » Na tej wieży albo raczej sali, królowie uciechy swoje miewali, kolacye jadali, taÅ„ce i różne odprawowali rekreacye, bo jest w Å›licznym bardzo prospekcie 5: może z... » W latach piêædziesi¹tych by³o ono g³ówn¹ orientacj¹ teoretyczn¹, obecnie stanowi442jedno z wielu podejœæ, jakimi mo¿e dysponowaæ terapeuta (GAP 1987, Mohl i in...
|
|
Dzieci to nie książeczki do kolorowania. Nie da się wypełnić ich naszymi ulubionymi kolorami.
|
Dwie formy implementacji polimorfizmu w języku C++ możemy opisać w następujący
sposób:
Polimorfizm zaimplementowany przez zastosowanie dziedziczenia jest
powiÄ…zany i dynamiczny:
powiązanie oznacza, że konkretne typy obiektów są zależne od innego typu
(klasy bazowej);
dynamika polega na tym, że klasa wywoływanej funkcji zostaje ustalona
dopiero podczas działania programu.
Rozdział 7. Szablony
423
Polimorfizm zaimplementowany z wykorzystaniem szablonów jest niepowiązany
i statyczny:
niepowiązanie oznacza, że typy konkretne nie są zależne od innych typów;
statyczny polimorfizm polega na ustaleniu klasy wywoływanej funkcji podczas
kompilacji programu.
Dynamiczny polimorfizm jest więc skróconą nazwą powiązanego polimorfizmu dynamicznego, podobnie termin polimorfizm statyczny stosowany jest jako skrócona wersja
określenia niepowiązany polimorfizm statyczny. W innych językach programowania do-
stępne są jeszcze inne kombinacje (na przykład w języku Smalltalk występuje niepowiązany polimorfizm dynamiczny).
Zalety polimorfizmu dynamicznego są następujące:
Umożliwia posługiwanie się heterogenicznymi kolekcjami obiektów.
Wymaga mniej kodu (funkcje kompilowane sÄ… tylko raz dla typu 34'5).
Polimorficzne operacje mogą zostać dostarczone w postaci kodu wynikowego
(kod szablonów musi zawsze być kodem źródłowym).
Ma lepszą obsługę błędów przez kompilator (patrz podrozdział 7.6.2).
Zalety polimorfizmu statycznego wymienione zostały poniżej:
Ma lepszą efektywność kodu (możliwa jest lepsza optymalizacja, ponieważ kod
nie zawiera funkcji wirtualnych). W praktyce można uzyskać poprawę od 2
do nawet 10 razy.
Jest niepowiązany (tworzone klasy nie są zależne od żadnego innego kodu).
Dzięki temu możliwe jest użycie typów podstawowych.
Nie wymaga stosowania wskaźników.
Typy konkretne nie muszą implementować kompletnego interfejsu (ponieważ
szablony wymagają tylko operacji, które są rzeczywiście wywoływane w programie).
Jeśli chodzi o kontrolę zgodności typów, obie formy polimorfizmu mają wady i zalety.
Polimorfizm dynamiczny wymaga jawnego określenia typu uogólnienia dla konkretne-
go obiektu geometrycznego. W przypadku polimorfizmu statycznego każda klasa może
zostać użyta jako rodzaj obiektu geometrycznego, jeśli tylko dysponuje odpowiednimi operacjami. Z drugiej jednak strony, polimorfizm dynamiczny nie gwarantuje, że ho-mogeniczne kolekcje zawierają zawsze obiekty jednego typu. Aby sprawić, żeby kolek-
cja zawierała na przykład wyłącznie odcinki, należy samodzielnie zaprogramować kon-
trolę typów obiektów umieszczanych w kolekcji.
Powyższe uwagi skłaniają nas w praktyce do użycia polimorfizmu statycznego, przede
wszystkim ze względu na jego wyższą efektywność. Natomiast gdy parametry szablo-
nów nie są znane w momencie kompilacji lub program wymaga użycia kolekcji hetero-
genicznych, właściwym rozwiązaniem będzie zastosowanie polimorfizmu dynamicznego.
424
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
'$!
Jeśli przy posługiwaniu się parametrem szablonu korzystamy z pomocniczego
typu zdefiniowanego dla danego szablonu, to typ ten musi zostać określony
za pomocą słowa kluczowego
.
Klasy wewnętrzne oraz funkcje składowe mogą być również szablonami. W ten
sposób możemy uzyskać niejawną konwersję w przypadku operacji szablonów
klas. Konwersja ta nie odbywa się jednak z pominięciem kontroli zgodności typów.
Szablon operatora przypisania nie ukrywa domyślnego operatora przypisania.
Polimorfizm może zostać zaimplementowany także za pomocą szablonów.
RozwiÄ…zanie takie posiada wady i zalety.
%
!
Szablony stanowią nową formę kodu źródłowego. Kompilator sprawdza składnię szablonów. Szablony stają się kodem wynikowym dopiero na skutek określenia typu będą-
cego ich parametrem. Z koncepcją szablonów związane są pewne problemy, które zostaną omówione w bieżącym podrozdziale.
(.& !
Szablony przetwarzane są przez kompilator dwukrotnie: za pierwszym razem spraw-dzana jest składnia szablonu podczas kompilacji jego kodu, a kolejna kontrola ma miej-sce podczas kompilacji kodu wygenerowanego dla konkretnego typu. W podrozdziale 7.2.3 wspomniane zostało już, że takie rozwiązanie wykracza poza tradycyjny model kompilacji i konsolidacji.
Dlatego też najprostszym rozwiązaniem jest umieszczanie szablonów w plikach na-główkowych. Metoda ta posiada jednak istotne słabości:
Ten sam kod kompilowany jest wielokrotnie. Na przykład każdy moduł
wykorzystujÄ…cy szablon $
dla elementów typu wymagać będzie
ponownego skompilowania kodu szablonu. Nie tylko wydłuża to czas kompilacji,
ale także umieszcza skompilowany kod szablonu w wielu plikach wynikowych.
Jeśli pliki te używane są następnie do utworzenia pliku wykonywalnego, program
konsolidujący powinien usunąć powtarzający się kod, ponieważ w przeciwnym
razie niepotrzebnie powstanie plik wykonywalny o znacznym rozmiarze.
Kod szablonu może być dostarczony użytkownikowi tylko w postaci kodu
źródłowego. Rozwiązanie takie nie jest do przyjęcia, gdy kod szablonu zawiera
istotne dla firmy rozwiązania technologiczne objęte prawem autorskim.
Istnieją dwie inne metody posługiwania się szablonami, które zostaną teraz omówione.
Każda z nich posiada pewne wady. W przypadku szablonów, przynajmniej na razie, nie
istnieje więc rozwiązanie doskonałe.
Rozdział 7. Szablony
425
Dostępnych jest także szereg rozwiązań specyficznych dla poszczególny producentów.
Na przykład rozwiązanie umożliwiające zastosowanie specjalnych poleceń preprocesora
do przetwarzania szablonów. Rozwiązania takie nie będą przedmiotem naszego zainte-
resowania.
Jednym ze sposobów zapobiegania wielokrotnej kompilacji tego samego szablonu jest technika jawnego tworzenia instancji.
Przy zastosowaniu tej techniki w plikach nagłówkowych umieszczamy jedynie deklara-
cje szablonów:
5
59:0>4T00
5
9:0>4T00
2
3
2
-
((((( &((((((((((((((((((((((((((((((((((
/0012
3
2
-
-
3
2
- %
-
#
(((() &((((((((((((((((((((((((((((((((((
534(056((
Definicje szablonów umieszczamy w osobnym pliku nagłówkowym, który dołącza plik
nagłówkowy zawierający ich deklaracje:
5
59:0>G9<4T00
5
9:0>G9<4T00
"$%"
2
2
426
|
|
|