May 1, 2025, Thursday, 120

Przykładowe zadania do Laboratorium 8

From MJanik

(Difference between revisions)
Jump to: navigation, search
(Created page with "'''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...")
 
Line 15: Line 15:
W programie głównym należy:
W programie głównym należy:
-
a. stworzyć obiekt klasy figura. Wypisać pole.
+
a. stworzyć obiekt klasy figura (x=3, y=5). Wypisać pole.
-
b. stworzyć obiekt klasy prostokat. Wypisać pole.
+
b. stworzyć obiekt klasy prostokat (x=2, y=2, a = 4, b =6). Wypisać pole.
-
c. stworzyć obiekt klasy okrag. Wypisać pole.
+
c. stworzyć obiekt klasy okrag (x=1, y = 1, R=5). Wypisać pole.
-
d. zamienić funkcje Pole() w klasie Figura na metode czysto wirtualną i poprawiamy program tak,
+
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ć?  
by się skompilował – czego nie możemy wtedy w programie zrobić?  
-
   virtual double Pole() = 0;
+
   virtual double Pole() = 0; // deklaracja metody czysto wirtualnej
Wskazówka: wszystkie metody czysto wirutalne muszą istnieć w klasach pochodnych.
Wskazówka: wszystkie metody czysto wirutalne muszą istnieć w klasach pochodnych.
Line 30: Line 30:
Po co tworzyć klasy abstrakcyjne?
Po co tworzyć klasy abstrakcyjne?
 +
Czasem mamy jakiś obiekt, który łączy cechy kilku innych (jak np. nasza klasa Figura) ale sama nie
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ł
przedstawia swoją istotną żadnego konkretnego obiektu. Mamy okręgi, prostokąty, trójkąty i inne – jak by mógł
Line 36: Line 37:
Klasa abstrakcyjna jest klasą jakby nieskończoną. Jej dokończenie realizowane jest przez klasy pochodne.
Klasa abstrakcyjna jest klasą jakby nieskończoną. Jej dokończenie realizowane jest przez klasy pochodne.
-
Należy zwrócić jeszcz 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
+
Należy zwrócić jeszcze uwagę na pewną zasadę, którą należy stosować:
-
virtual.''' Skoro w klasie deklarujemy jakąś funkcję wirtualną, to znaczy, że na obiekty klas pochodnych
+
 
 +
'''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
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.
mogłoby być problemem – nie zwalnialibyśmy pamięci dla niekórych składników klas pochodnych.

Latest revision as of 14:02, 4 December 2012

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