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