16.05.2015 Views

Programowanie w C++ Borland Builder - Wyższa Szkoła Informatyki ...

Programowanie w C++ Borland Builder - Wyższa Szkoła Informatyki ...

Programowanie w C++ Borland Builder - Wyższa Szkoła Informatyki ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

LEKCJA 35. FUNKCJE WIRTUALNE i KLASY ABSTRAKCYJNE.<br />

________________________________________________________________<br />

W trakcie tej lekcji dowiesz się, co mawia żona programisty, gdy<br />

nie chce być obiektem klasy abstrakcyjnej.<br />

________________________________________________________________<br />

FUNKCJE W PEŁNI WIRTUALNE (PURE VIRTUAL).<br />

W skrajnych przypadkach wolno nam umieścić funkcję wirtualną w<br />

klasie bazowej nie definiując jej wcale. W klasie bazowej<br />

umieszczamy wtedy tylko deklarację-prototyp funkcji. W<br />

następnych pokoleniach klas pochodnych mamy wtedy pełną swobodę<br />

i możemy zdefiniować funkcję wirtualną w dowolny sposób -<br />

adekwatny dla potrzeb danej klasy pochodnej. Możemy np. do klasy<br />

bazowej (ang. generic class) dodać prototyp funkcji wirtualnej<br />

funkcja_eksperymentalna() nie definiując jej w (ani wobec)<br />

klasie bazowej. Sens umieszczenia takiej funkcji w klasie<br />

bazowej polege na uzyskaniu pewności, iż wszystkie klasy<br />

pochodne odziedziczą funkcję funkcja_eksperymentalna(), ale<br />

każda z klas pochodnych wyposaży tę funkcję we własną definicję.<br />

Takie postępowanie może okazać się szczególnie uzasadnione przy<br />

tworzeniu biblioteki klas (class library) przeznaczonej dla<br />

innych użytkowników. <strong>C++</strong> w wersji instalacyjnej posiada już<br />

kilka gotowych bibliotek klas. Funkcje wirtuale, które nie<br />

zostają zdefiniowane - nie posiadają zatem ciała funkcji -<br />

nazywane są funkcjami w pełni wirtualnymi (ang. pure virtual<br />

function).<br />

O KLASACH ABSTRAKCYJNYCH.<br />

Jeśli zadeklarujemy funkcję CZwierzak::Oddychaj() jako funkcję w<br />

pełni wirtualną, oprócz słowa kluczowego virtual, trzeba tę<br />

informację w jakiś sposób przekazać kompilatorowi <strong>C++</strong>. Aby <strong>C++</strong><br />

wiedział, że naszą intencją jest funkcja w pełni wirtalna, nie<br />

możemy zadeklarować jej tak:<br />

class CZwierzak<br />

{<br />

...<br />

public:<br />

virtual void Oddychaj();<br />

...<br />

};<br />

a następnie pominąć definicję (ciało) funkcji. Takie<br />

postępowanie <strong>C++</strong> uznałby za błąd, a funkcję - za zwykłą funkcję<br />

wirtualną, tyle, że "niedorobioną" przez programistę. Naszą<br />

intencję musimy zaznaczyć już w definicji klasy w taki sposób:<br />

class CZwierzak<br />

{<br />

- 343-

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!