Konwersja i dziedziczenie II
Transkrypt
Konwersja i dziedziczenie II
Uniwersytet Zielonogórski Wydział Informatyki, Elektrotechniki i Telekomunikacji Instytut Sterowania i Systemów Informatycznych Informatyka stacjonarne-dzienne pierwszego stopnia z tyt. inżyniera Laboratorium Programowania Obiektowego Konwersja i dziedziczenie II 1. (Obowiązkowe - łańcuchy raz jeszcze!) Wewnątrz klasy: class string int roz; char *wsk; public: //...metody }; nie ma zdefiniowanej funkcji ostream& operator<<(ostream&,string&). Napisz funkcję konwertującą tak, aby poprawne były instrukcje: string s("ABC"); cout<<s<<endl; 2. Przeprowadzić następujące eksperymenty i zinterpretować wyniki. a) Dane są konwersje zdefiniowane przez użytkownika: X −→ Y , Y −→ Z. Czy istnieje niejawna konwersja X −→ Z? b) Dana jest konwersja X −→ f loat. Czy istnieje konwersja X −→ int? c) Dane są konwersje: X −→ f loat, X −→ int, X −→ char. Czy poprawna jest instrukcja cout<<x<<endl, gdzie x jest obiektem klasy X? Jeżeli podane niejawne konwersje są niemożliwe, to czy można je przeprowadzić bez dodawania nowych metod konwertujących? 3. (Obowiązkowe!) Wykorzystując mechanizm dziedziczenia zbudować klasy odzwierciedlające następujący graf: A ¡ ª @ ¡ R @ B C ¡ @ ¡ ª @ ¡ R¡ ª D E ¡@ ª ¡ R @ F G ©HH ¡ © j ¡ ª © ¼ ?H H I J ¡ ©H ¡ ? ¼© ?HH © j ¡ ª K L M Każda klasa pochodna ma posiadać co najmniej jedną zmienną dodatkową względem swoich klas podstawowych. Dziedziczenie wykonać na dwa sposoby: konwencjonalnie i z użyciem klas wirtualnych. W programie głównym zadeklarować obiekty każdej z klas i sprawdzić, które z nich najbardziej zyskują (i czy w ogóle zyskują?) na dziedziczeniu wirtualnym (do sprawdzenia wielkości obiektu zastosować funkcję sizeof()). 4. (Obowiązkowe!) Skonstruować klasy odzwierciedlające następujący graf dziedziczenia: A ©H © HH © ¼ j B C ©HH ©HH © © © ¼ j© H ? ¼ j H D E F HH ©HH © © © H j© ¼ j© H ¼ G H Dodatkowo obiekt każdej klasy zawiera w sobie po jednym obiekcie klas, od których bezpośrednio dziedziczy. Przykładowo, obiekt klasy E, dla której klasami podstawowymi są A, B oraz C, posiada jako komponenty po jednym elemencie typu A, B i C. Dla każdej z klas zdefiniować konstruktor i destruktor, a następnie w programie głównym przetestować kolejność ich wywoływania dla obiektu każdego z zadeklarowanych typów. 5. Niech będzie dany następujący typ danych: class tablica1D{ protected: int rozmiar1; int *tab; }; reprezentujący dynamiczną tablicę jednowymiarową. a) rozbudować klasę o domniemany konstruktor inicjalizujący, destruktor, operator przypisania, oraz metody: wyprowadzającą tablicę na ekran, wyznaczającą wartości minimalną i maksymalną, sortującą tablicę, b) wykorzystać powyższą klasę i stosując mechanizm dziedziczenia napisać definicję klasy tablica2D, która będzie miała takie same metody operujące na tablicy dwuwymiarowej, przy czym sortowanie oraz szukanie minimum i maksimum wykonać dla każdego wiersza osobno, a wynik zwrócić jako tablicę wartości, c) wykorzystując klasy tablica1D oraz tablica2D zrobić to samo co w punkcie b), tylko dla tablicy trójwymiarowej (sortowanie i szukanie min/max zrealizować w odniesieniu do pierwszego wymiaru tablicy). 6. * Wykorzystując wyniki podpunktu a) zadania 5 napisać klasę reprezentującą uogólnioną tablicę dynamiczną n-wymiarową (liczba wymiarów tablicy także ma być dobierana dynamicznie). Funkcje szukania ekstremów oraz sortowania skonstruować w taki sposób, aby możliwe było ich zastosowanie do dowolnie wybranego wymiaru. Litertura • Grębosz J.,Symfonia C++ standard, Edition 2000, 2008 • Grębosz J., Pasja C++, Edition 2000, 200 • Stroustrup B., Język C++, Wydawnictwa Naukowo-Techniczne 1994, 2000 i 2002 • Eckel B., Thinking in C++. Edycja polska, Helion , 2002