From MJanik
(Difference between revisions)
|
|
| (4 intermediate revisions not shown) |
| Line 1: |
Line 1: |
| | + | [http://www.if.pw.edu.pl/~majanik/data/JP/2025/Zadanie12_FiguraOkrag.pdf Laboratorium 12] |
| | + | |
| | '''Wirtualność oraz polimorfizm''' (tu rozumiany jako możliwość wyboru postaci funkcji w trakcie działania | | '''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 | | programu) stanowią zupełnie inne podejście do programowania niż programowanie proceduralne, które do tej |
| Line 6: |
Line 8: |
| | | | |
| | | | |
| - | '''1. Zadanie: Wirtualność i klasy abstrakcyjne – urządzenia elektryczne''' | + | '''1. Zadanie przygotowywujące do zajęć: Wirtualność i klasy abstrakcyjne – urządzenia elektryczne''' |
| | | | |
| | Proszę stworzyć klasę Urzadzenie posiadającą pola: | | Proszę stworzyć klasę Urzadzenie posiadającą pola: |
| Line 66: |
Line 68: |
| | Klasa abstrakcyjna jest klasą niedokończoną – jej pełna funkcjonalność realizowana jest dopiero w klasach pochodnych. | | Klasa abstrakcyjna jest klasą niedokończoną – jej pełna funkcjonalność realizowana jest dopiero w klasach pochodnych. |
| | | | |
| - | 5. Należy zwrócić uwagę na następującą zasadę:
| |
| | | | |
| - | Jeśli klasa deklaruje jedną ze swoich metod jako virtual, wówczas jej destruktor również powinien być zadeklarowany jako virtual.
| + | 5. '''Wirtualny destruktor''' |
| | + | |
| | + | Należy zwrócić uwagę na następującą zasadę: |
| | + | |
| | + | jeśli klasa deklaruje jedną ze swoich metod jako virtual, wówczas jej destruktor również powinien być zadeklarowany jako virtual. |
| | | | |
| | virtual ~Urzadzenie() {} | | virtual ~Urzadzenie() {} |
Latest revision as of 07:58, 18 December 2025
Laboratorium 12
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. Zadanie przygotowywujące do zajęć: Wirtualność i klasy abstrakcyjne – urządzenia elektryczne
Proszę stworzyć klasę Urzadzenie posiadającą pola:
double napiecie, prad;
oraz jej dwie klasy pochodne:
Grzejnik (double opor),
Silnik (double sprawnosc).
Klasa Urzadzenie powinna posiadać wirtualną metodę:
virtual double Moc() { return 0; }
(domyślnie niech zwraca 0).
Klasy pochodne powinny zwracać odpowiednią moc w zależności od typu urządzenia:
- dla grzejnika: P = U*I
- dla silnika: P = U*I*sprawnosc
2. W programie głównym należy:
a. stworzyć obiekt klasy Urzadzenie
(napiecie = 230, prad = 2).
Wywołać metodę Moc() i wypisać wynik na ekranie.
b. stworzyć obiekt klasy Grzejnik
(napiecie = 230, prad = 4, opór = 50).
Wywołać metodę Moc() i wypisać wynik.
c. stworzyć obiekt klasy Silnik
(napiecie = 230, prad = 3, sprawność = 0.8).
Wywołać metodę Moc() i wypisać wynik.
3. Następnie zamienić metodę Moc() w klasie Urzadzenie na metodę czysto wirtualną:
virtual double Moc() = 0; // deklaracja metody czysto wirtualnej
i poprawić program tak, aby ponownie się kompilował.
Pytanie:
Czego nie możemy już zrobić w programie po tej zmianie?
(Wskazówka: nie można tworzyć obiektów klasy, która zawiera metodę czysto wirtualną.)
4. Klasa, która ma co najmniej jedną funkcję czysto wirtualną, nazywana jest klasą abstrakcyjną.
Po co tworzyć klasy abstrakcyjne?
Czasem mamy pojęcie ogólne (np. urządzenie elektryczne), które łączy cechy różnych obiektów,
ale samo w sobie nie reprezentuje konkretnego bytu.
Mamy grzejniki, silniki, żarówki – ale czym dokładnie jest „urządzenie” i jaką ma moc?
Klasa abstrakcyjna jest klasą niedokończoną – jej pełna funkcjonalność realizowana jest dopiero w klasach pochodnych.
5. Wirtualny destruktor
Należy zwrócić uwagę na następującą zasadę:
jeśli klasa deklaruje jedną ze swoich metod jako virtual, wówczas jej destruktor również powinien być zadeklarowany jako virtual.
virtual ~Urzadzenie() {}
Uzasadnienie:
Skoro obiekty klas pochodnych mogą być obsługiwane przez wskaźniki do klasy bazowej, to przy ich niszczeniu musimy mieć pewność, że zostaną poprawnie wywołane destruktory klas pochodnych – w przeciwnym razie może dojść do wycieków pamięci.