Ć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

Podobne dokumenty