Języki Programowania 12From MJanikLaboratorium 12 - pt. 10-12 Laboratorium 12 - czw. 14-16
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:
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.
virtual double Moc() = 0; // deklaracja metody czysto wirtualnej
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.
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. |