From MJanik
(Difference between revisions)
|
|
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