Ćwiczenia I - matrix.umcs.lublin.pl
Transkrypt
Ćwiczenia I - matrix.umcs.lublin.pl
Ćwiczenia I 12 października 2010 Powtórzenie Dziedziczenie Jest to związek pomiędzy klasami obiektów, określający specjalizację klas: klasa dziedzicząca jest uszczegółowieniem klasy dziedziczonej. class A{}; class B : public A{}; Polimorfizm Jest to mechanizm pozwalający na różne zachowanie się metody w zależności od klasy obiektu wywołującego metodę. Oznacza to dla obiektu klasy pochodnej możliwość odwołania się do przedefiniowanych metod z klasy bazowej. class Human{ public: virtual void write(){ std::cout << "I Am Human" << std::endl; } }; class Husband : public Human{ public: void write(){ std::cout << "I Am Husband" << std::endl; } } class Father : public Husband{ public: void write(); }; Agregacja Polega na zdefiniowaniu nowej klasy poprzez złożenie klas już istniejących. Pkd.: class Silnik{}; class Akumulator{}; class Koło{}; class Szyba{}; class Okno{ public: Szyba szyba; }; class Drzwi{}; class Nadwozie{ public: Okno[6] okna; Drzwi[5] drzwi; }; class Podwozie(){ public: Koło[] koła = new Koło[4]; }; class Samochód{ public: Nadwozie nadwozie; Podwozie podwozie; }; Kompozycja Jest szczególnym przypadkiem agregacji, polegającym na wyłączności istnienia obiektów danej klasy w obiekcie klasy agregującej. Przeciążanie funkcji Polega na deklaracji funkcji o tym samym nazewniku, a różną liczbą parametrów i/lub ich typów: void fun(int a); void fun(float b); void fun(int a, float b); Należy wziąć pod uwagę fakt, że typ zwracany nie stanowi wyróżnika funkcji, zatem nie można dodefiniować funkcji: int fun(char a); za to można: int fun(float a, float b); Przeciążanie operatorów Polega na definiowaniu operatorów dla nowych typów. Przynajmniej jeden z operandów musi być niebazowy, zaś operator dla tego zestawu typów musi być niezdefiniowany. Operatory: • jednoargumentowe, np.: −, +, !,˜, ++, −−, & 2 Complex operator-( Complex c){}; Complex & operator++( Complex &c); //postifxowe Complex & operator++( Complex &c, int); //prefixowe • dwuargumentowe, np.: −, +, ∗, /, %,operatory podstawienia ( =, ∗ =, . . . ) Complex & operator-( Complex &c1, Complex &c2); Complex & operator*( Complex &c1, Complex &c2); • wieloargumentowe: () Zadania 1. Zad. 1. - Complex Zdefiniuj klasę Complex reprezentującą liczby zespolone. Zdefiniuj operatory dodawania, mnożenia, odejmowania i dzielenia dla klasy Complex. Zdefiniuj równie operatory relacji <, >, ==, operator przypisania i konwersji. 2. Zad. 2. - String Zdefiniuj klasę String reprezentującą łańcuchy. Dopisz operatory relacji, przypisania, konkatenacji. 3. Zad. 3. - Konstruktory Rozważ następujcy kod: class Bazowa{ public: int a,b; Bazowa(); ~Bazowa(); }; class Pochodna : public Bazowa{ public: int h; Pochodna(); ~Pochodna(); }; int main(int argc, char* argv[]){ Pochodna c(); c.a = 1; c.b = 2; c.h = 5; try{ throw c; } catch (Bazowa xx){ Pochodna *c2 = (Pochodna *)&xx; int j = c2->h; } } 3 Co w nim jest nie tak? Jak należy to poprawić? Ile wywoła się kontruktorów, a ile destruktorów? 4. Zad. 4. - Figury. Stos. • Zdefiniuj figury: koło, trójkąt, kwadrat w postaci klas. Zastosuj dziedziczenie po abstrakcyjnej klasie Figura, która będzie miała metodę pole(). • Zdefiniuj dla nich stos. 5. Zad. 5. - Samochód Stwórz klasę Samochod, która będzie dziedziczyć po klasie Pojazd, a sama będzie agregatem klas. Zdefiniuj klasy składowe. Napisz funkcję jedz(), która będzie uruchamiać samochód i hamuj(), która będzie go zatrzymywać. 4