Programowanie w C++ Wykład 13 Katarzyna Grzelak 4 czerwca 2018 K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26
Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe plus funkcje składowe (metody) K.Grzelak (Wykład 13) Programowanie w C++ 2 / 26
Konstruktory i destruktory - powtórzenie Konstruktory i destruktory to specjalne funkcje składowe klasy Konstruktor wywoływany jest przy tworzeniu obiektu Konstruktor kopiujacy wywoływany jest przy tworzeniu kopii obiektu Destruktor wywoływany jest przed likwidacja obiektu K.Grzelak (Wykład 13) Programowanie w C++ 3 / 26
Konstruktor kopiujacy vs operator przypisania Tutaj uruchamiany jest konstruktor kopiujacy: Wektor2D v1; Wektor2D v2(v1); Wektor2D v3=v1; Tutaj działa operator przypisania (!): Wektor2D v1(0.5,0.2,1.5,0.8); Wektor2D v2; v2=v1; Wektor2D - klasa z poprzednich wykładów. K.Grzelak (Wykład 13) Programowanie w C++ 4 / 26
Przeładowanie operatorów - przypomnienie Przeładowanie operatorów to przedefiniowanie standardowych operatorów: +,,, /,... tak, żeby działały dla obiektów danej klasy. K.Grzelak (Wykład 13) Programowanie w C++ 5 / 26
Przeładowanie operatorów - przypomnienie Przeładowane operatory nie musza mieć znaczenia podobnego do oryginalnego, np.: + nie musi służyć do dodawania obiektów K.Grzelak (Wykład 13) Programowanie w C++ 6 / 26
Operator przypisania Operator przypisania służy do przypisania zawartości jednego obiektu klasy T drugiemu obiektowi tej klasy: T& T::operator=(T &); np. Wektor2D v1(0.5,0.2,1.5,0.8); Wektor2D v2; v2=v1; K.Grzelak (Wykład 13) Programowanie w C++ 7 / 26
Operator przypisania Jeśli w definicji klasy nie ma zdefiniowanego operatora przypisania, to zostanie stworzony automatycznie. Kiedy to nie będzie wystarczajace: Przykład Wskaźnik do dynamicznej tablicy jest składnikiem obiektu Tablica nie jest częścia obiektu Przypisanie starego wskaźnika nowemu oznacza że oba obiekty będa korzystać z tej samej tablicy! Rozwiazanie: operator przypisania, który tworzy nowa tablicę (podobnie w przypadku konstruktora kopiujacego) K.Grzelak (Wykład 13) Programowanie w C++ 8 / 26
Dziedziczenie K.Grzelak (Wykład 13) Programowanie w C++ 9 / 26
Klasy pochodne i podstawowe Dziedziczenie = definiowanie nowej klasy przy wykorzystaniu wcześniej istniejacej klasy Klasa pochodna dziedziczy składniki (funkcjonalności!) klasy podstawowej, ale może mieć nowe dane i funkcje składowe. K.Grzelak (Wykład 13) Programowanie w C++ 10 / 26
Klasy pochodne i podstawowe Przykłady klas podstawowych i pochodnych: Klasa podstawowa Owoc Samochod ios ostream Klasy pochodne Jablko, Gruszka Kabriolet, SUV, TIR istream, ostream ofstream, ostringstream, iostream Podobieństwa pomiędzy praca z różnymi rodzajami strumieni nieprzypadkowe! K.Grzelak (Wykład 13) Programowanie w C++ 11 / 26
Jak zdefiniować klasę która jest pochodna innej klasy Klasa podstawowa może wygladać np. tak: class Mebel { public: Mebel(string, int); int get_rok_produkcji() const ; void opis() const ;... private: string producent; int rok_produkcji; }; K.Grzelak (Wykład 13) Programowanie w C++ 12 / 26
Jak zdefiniować klasę która jest pochodna innej klasy Klasa pochodna od klasy Mebel może wygladać np. tak: class Komoda : public Mebel { public: Komoda(string, int, string); void opis() const ;...private: string model; int ile_szuflad; } Komoda jest rodzajem mebla. K.Grzelak (Wykład 13) Programowanie w C++ 13 / 26
Klasy pochodne i podstawowe - zasłanianie nazw W obu klasach moga być składniki o tej samej nazwie: składnik z klasy pochodnej zasłania odziedziczony składnik, ale do obu można się odwołać: Komoda k1; k1.opis(); k1.mebel::opis(); K.Grzelak (Wykład 13) Programowanie w C++ 14 / 26
Dziedziczenie składników różnego typu O czym decyduje klasa podstawowa, czyli w jaki sposób dziedziczone sa składniki public, protected i private: Klas pochodna nie ma dostępu tylko do prywatnych składników klasy podstawowej. K.Grzelak (Wykład 13) Programowanie w C++ 15 / 26
Dziedziczenie składników różnego typu Trzeci rodzaj typu składników klasy protected: składniki występujace w klasie podstawowej za słowem protected sa dostępne dla klas pochodnych jak publiczne. Dla innych sa jak prywatne. K.Grzelak (Wykład 13) Programowanie w C++ 16 / 26
Dziedziczenie składników różnego typu O czym decyduje klasa pochodna, czyli w jaki sposób klasa pochodna chce udostępniać światu dziedziczone składniki: W definicji klasy pochodnej: class Komoda : class Komoda : class Komoda : public Mebel protected Mebel private Mebel K.Grzelak (Wykład 13) Programowanie w C++ 17 / 26
Dziedziczenie składników różnego typu Można dziedziczyć po więcej niż jednej klasie: class Komoda : public Mebel, private Regal K.Grzelak (Wykład 13) Programowanie w C++ 18 / 26
Dziedziczenie Czy wszystko się dziedziczy? Nie. Klasa pochodna nie dziedziczy: prywatnych składników klasy podstawowej konstruktorów destruktorów operatorów przypisania K.Grzelak (Wykład 13) Programowanie w C++ 19 / 26
Dziedziczenie Klasa, która jest pochodna jednej klasy, sama może być klasa podstawowa innej klasy, np.: ios ostream ofstream K.Grzelak (Wykład 13) Programowanie w C++ 20 / 26
Kolejność w jakiej wywoływane sa konstruktory Kolejność uruchamiania: 1 konstruktory obiektów będacych składnikami klasy podstawowej 2 konstruktor klasy podstawowej 3 konstruktory obiektów będacych składnikami klasy pochodnej 4 konstruktor klasy pochodnej K.Grzelak (Wykład 13) Programowanie w C++ 21 / 26
Jeszcze o konstruktorach Na liście inicjalizacyjnej konstruktora klasy pochodnej można umieścić wywołanie konstruktora klasy podstawowej. K.Grzelak (Wykład 13) Programowanie w C++ 22 / 26
Przykład Klasa podstawowa class Zwierze { public: Zwierze(){ } Zwierze(string nazwa) {gromada=nazwa;}... protected: string gromada; string gatunek; string imie; int rok_urodzenia; }; K.Grzelak (Wykład 13) Programowanie w C++ 23 / 26
Przykład Klasa pochodna class Kot : public Zwierze { public: Kot(){} Kot(string nazwa); string getgromada() const {return gromada;} string getgatunek() const {return gatunek;}... }; Kot::Kot(string nazwa) : Zwierze( ssak ) { imie=nazwa; gatunek= kot_domowy ; } K.Grzelak (Wykład 13) Programowanie w C++ 24 / 26
Przykład Program int main(){ Kot kot1( Filemon ); cout «gromada= «kot1.getgromada() «endl; cout «gatunek= «kot1.getgatunek() «endl; return 0; } K.Grzelak (Wykład 13) Programowanie w C++ 25 / 26
Zalety dziedziczenia Unikanie wielokrotnego pisania tych samych lub podobnych fragmentów kodu Możliwość dostosowania kodu do zmieniajacych się wymagań bez zmiany głównej części programu Możliwość tworzenia hierarchii klas, wyrażanie zależności między klasami... K.Grzelak (Wykład 13) Programowanie w C++ 26 / 26