May 6, 2024, Monday, 126

Przykładowe zadania do Laboratorium 8

From MJanik

Jump to: navigation, search

Wirtualność oraz polimorfizm (tu rozumiany jako możliwość wyboru postaci funkcji w trakcie działania programu) stanowią zupełnie inne podejście do programowania niż programowanie proceduralne, które do tej pory wykorzystywaliśmy. Są najważniejszą cechą programowania orientowanego obiektowo (OOP – Object Oriented Programming) w języku C++ (inaczej mówiąc: orientującego się według typu obiektu) i mają ogromne możliwości, które objawiają się w pełni przy dużych projektach. To z tego powodu język ten jest wykorzystywany w pisaniu wielkich aplikacji, od systemów operacyjnych po gry komputerowe.


1. Proszę stworzyć klasę Figura (double x,y), oraz jej dwie klasy pochodne: Okrąg (double R) oraz Prostokąt (double a,b) Klasa Figura powinna posiadać wirtualną metodę

virtual double Pole() { return 0; }

(domyślnie niech zwraca 0).

Klasy pochodne powinny zwracać odpowiednie pola w zależności od typu figury.

W programie głównym należy:

a. stworzyć obiekt klasy figura (x=3, y=5). Wypisać pole.

b. stworzyć obiekt klasy prostokat (x=2, y=2, a = 4, b =6). Wypisać pole.

c. stworzyć obiekt klasy okrag (x=1, y = 1, R=5). Wypisać pole.

d. zamienić funkcje Pole() w klasie Figura na metodę czysto wirtualną i poprawiamy program tak, by się skompilował – czego nie możemy wtedy w programie zrobić?

 virtual double Pole() = 0; // deklaracja metody czysto wirtualnej

Wskazówka: wszystkie metody czysto wirutalne muszą istnieć w klasach pochodnych.

Klasa, która ma co najmniej jedną funkcję czysto wirtualną nazywamy klasą abstrakcyjną


Po co tworzyć klasy abstrakcyjne?

Czasem mamy jakiś obiekt, który łączy cechy kilku innych (jak np. nasza klasa Figura) ale sama nie przedstawia swoją istotną żadnego konkretnego obiektu. Mamy okręgi, prostokąty, trójkąty i inne – jak by mógł zareagować matematyk, gdybyśmy kazali policzyć pole figury?

Klasa abstrakcyjna jest klasą jakby nieskończoną. Jej dokończenie realizowane jest przez klasy pochodne.


Należy zwrócić jeszcze uwagę na pewną zasadę, którą należy stosować:

Jeśli klasa deklaruje jedną ze swoich funkcji jako virtual, wówczas jej destruktor deklarujemy także jako virtual. Skoro w klasie deklarujemy jakąś funkcję wirtualną, to znaczy, że na obiekty klas pochodnych zamierzamy czasem mówić jak na obiekty klasy podstawowej, co przy późniejszym niszczeniu obiektów mogłoby być problemem – nie zwalnialibyśmy pamięci dla niekórych składników klas pochodnych.


2. Makefile - cz. 2

Należy wziąć dowolny z programów realizowanych na zajęciach, który posiada więcej niż jeden plik .cpp, oraz zrealizować na nim po kolei wszystkie polecenia i zmiany opisane w pliku:

Makefile - zadanie