Dziedziczenie Wykład 7 Dziedziczenie sekwencyjne

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Programowanie obiektowe
Programowanie obiektowe PO PO - LAB 2 Wojciech Pieprzyca.
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Metody wirtualne.
Wzorce.
Prowadzący: mgr inż. Elżbieta Majka
Static, const, volatile.
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
Programowanie obiektowe w Javie
Wielodziedziczenie od środka Konrad Lipiński
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
DZIEDZICZENIE · klasy bazowe i klasy pochodne WyświetlAutora( ) Autor
ODE Triggery. Wstęp n Triggery są trójką zdarzenie-warunek-akcja (event-condition- action). n Zdarzenia mogą być proste lub złożone, co zostanie omówione.
Struktury.
C++ wykład 5 ( ) Dziedziczenie.
C++ wykład 6 ( ) Polimorfizm.
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Wykład 1: Wskaźniki Podstawy programowania Programowanie w C
struct nazwa { lista składników }; Dostęp do składowych struktury Nazwa_Zmniennej_Strukturalnej. Nazwa_Składnika.
Obiekty dynamiczne Tworzenie klas 3 MPDI Programowanie obiektowe W4.
T: Różnice pomiędzy programowaniem strukturalnym a obiektowym
Programowanie obiektowe III rok EiT
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład XIII.
Programowanie obiektowe III rok EiT
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Maciek Mięczakowski
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 7 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Prasek Aneta, Skiba Katarzyna. Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać.
Kurs języka C++ – wykład 3 ( )
Kurs języka C++ – wykład 9 ( )
Programowanie w języku C++
Kurs języka C++ – wykład 5 ( )
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Programowanie strukturalne i obiektowe C++
Kurs języka C++ – wykład 4 ( )
K URS JĘZYKA C++ – WYKŁAD 2 ( ) Klasy i obiekty.
K URS JĘZYKA C++ – WYKŁAD 6 ( ) Polimorfizm.
Klasy ( uzupełnienie ). Definicja klasy Klasa jest zbiorem logicznie powiązanych danych i funkcji, przeznaczonych do realizacji konkretnego zadania; Zamknięcie.
Konstruktory i Destruktory. Konstruktor Konstruktor — co to? Konstruktor — co to? jest metodą służącą do inicjowania obiektów danej klasy jest metodą.
Dziedziczenie wielobazowe. dana klasa może mieć kilka bezpośrednich klas bazowych: dana klasa może mieć kilka bezpośrednich klas bazowych: kolorpołożenie.
Wykład 4 Klasa Vec, której konstruktory alokują pamięć dla obiektów 1.Przykład definicji klasy Vec 2.Definicje konstruktorów i destruktora 3.Definicja.
PO13-1 / 19 Wykład 13 Wyjątki i ich zgłaszanie Wyłapywanie wyjątków Obsługa wyjątków Wykorzystanie polimorfizmu Filtrowanie wyjątków Błędy w konstruktorach.
Wykład 2 Klasa Zesp i jej hermetyzacja 1.Przykład definicji klasy Zesp 2.Zmiana definicji klasy 3.Zmienne i funkcje statyczne PO2-1 / 28.
Wykład 5 Klasa Vec i jej operatory 1.Kategorie operatorów 2.Operatory ogólne - przykłady 3.Operatory specjalne [ ], ( ) oraz –> 4.Operatory new i delete.
Wykład 8 Polimorfizm 1.Funkcje polimorficzne 2.Czyste funkcje wirtualne i klasy abstrakcyjne PO8-1 / 38.
Podstawy informatyki Funkcje Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka Podstawy.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Programowanie Obiektowe – Wykład 6
Kurs języka C++ – wykład 3 ( )
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
Kurs języka C++ – wykład 4 ( )
Założenia projektowe Javy
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Zapis prezentacji:

Dziedziczenie Wykład 7 Dziedziczenie sekwencyjne Dziedziczenie wielobazowe (wielodziedziczenie) PO7-1 / 29

Dziedziczenie sekwencyjne diagram dziedziczenia, przykład sekwencji klas, przykłady konwersji definiowanych, konflikt nazw. PO7-2 / 29

Przykład dziedziczenia class Osoba{ protected:CString Imie,Nazwisko; CData data_urodzenia; /* pozostałe deklaracje */ }; class Pracownik:public Osoba{ protected:CStawka Wynagrodzenie; CData data_zatrudnienia; class Urzędnik:public Pracownik{ protected:CString NrPokoju,dział; class Kierownik:public Urzędnik{ protected:CStawka dodatek; Osoba Pracownik Urzędnik Kierownik PO7-3 / 29

Diagram dziedziczenia Klasa A jest bazową dla klasy B. Klasa B jest bazową dla klasy C. itd. Każda z klas: B, C, D, E ma tylko jedną klasę bazową. Klasa A Klasa B class A{ /* deklaracje */ }; class B:public A{ class C:public B{ class D:public C{ class E:public D{ Klasa C Klasa D Klasa E PO7-4 / 29

Organizacja obiektów Obiekt klasy A Pola klasy A Obiekt klasy bazowej jest pierwszym polem obiektu klasy pochodnej. Obiekt klasy B Pola klasy B Podobiekt A Obiekt klasy C Pola klasy C Podobiekt klasy B Pola klasy C Pola klasy B Podobiekt A Obiekt klasy D Pola klasy D Podobiekt klasy C Pola klasy D Pola klasy C Pola klasy B Podobiekt A Obiekt klasy E Pola klasy E Podobiekt klasy D Pola klasy E Pola klasy D Pola klasy C Pola klasy B Podobiekt A PO7-5 / 29

Konstruktory Konstruktory klas: B, C, D, E muszą wywoływać, w liście inicjacyjnej, konstruktory swoich klas bazowych, aby zainicjować podobiekty bazowe. // Konstruktor klasy A A::A(/*parametry dla A*/):// inicjatory pól klasy A {/*instrukcje funkcji konstruktora*/} // Konstruktor klasy B B::B(/*parametry dla B*/):A(/*argumenty dla A*/), // inicjatory pól klasy B {/*instrukcje funkcji konstruktora*/} // Konstruktor klasy C C::C(/*parametry dla C*/):B(/*argumenty dla B*/), // inicjatory pól klasy C {/*instrukcje funkcji konstruktora*/} PO7-6 / 29

Konstruktory c.d. // Konstruktor klasy D D::D(/*parametry dla D*/):C(/*argumenty dla C*/), // inicjatory pól klasy D {/*instrukcje funkcji konstruktora*/} // Konstruktor klasy E E::E(/*parametry dla E*/):D(/*argumenty dla D*/), // inicjatory pól klasy E {/*instrukcje funkcji konstruktora*/} PO7-7 / 29

Destruktory Destruktory klas: A, B, C, D, E muszą tworzyć ciąg funkcji polimorficznych. W tym celu w klasie A należy funkcję destruktora ~A( ) zadeklarować ze słowem virtual. // Definicja klasy A class A{ /*parametry dla A*/ // . . . public: virtual ~A( ); }; A *p=new E; // . . . delete p; W sytuacji posłużenia się wskaźnikiem na klasę bazową do usunięcia obiektu klasy pochodnej gwarantuje to automatyczne wywołanie destruktora klasy pochodnej do obiektu oraz destruktorów klas bazowych do każdego podobiektu. PO7-8 / 29

Destruktor wirtualny A *p=new E; // . . . delete p; Zmienna p jest wskaźnikiem na klasę A. Zatem instrukcja delete p; aktywowałaby tylko destruktor z klasy A. Destruktor polimorficzny (wirtualny) wywołuje swoją postać nie z klasy wskaźnika, ale z klasy wskazywanego obiektu – tutaj z klasy E. Aby usunąć obiekt klasy E, trzeba najpierw usunąć jego podobiekt z klasy D, do którego też będzie wywołany destruktor z klasy D. Aby usunąć podobiekt klasy D, trzeba najpierw usunąć jego podobiekt z klasy C, do którego też będzie wywołany destruktor z klasy C. Itd. PO7-9 / 29

Usuwanie obiektów Obiekt klasy E Pola klasy E Podobiekt klasy D Aktywowanie destruktora ~E( ) do obiektu klasy E Podbiekt klasy D Pola klasy D Podobiekt klasy C Aktywowanie destruktora ~D( ) do podobiektu klasy D Podbiekt klasy C Pola klasy C Podobiekt klasy B Aktywowanie destruktora ~C( ) do podobiektu klasy C Pola klasy B Podobiekt A Podbiekt klasy B Aktywowanie destruktora ~B( ) do podobiektu klasy B Pola klasy A Podbiekt klasy A Aktywowanie destruktora ~A( ) do podobiektu klasy A PO7-10 / 29

Punkt – Kolo - Walec Y Klasa Punkt y x, y, przesun(dx, dy) X x Y y x+dx Y R R y Klasa Kolo (x, y), r X x x+dx Z h Klasa Walec (x, y, r), h x x+dx X y dy R dx R Y PO7-11 / 29

Przykład sekwencji klas class Punkt { protected: double x, y; public: Punkt(double x=0, double y=0): x(x), y(y) { } void przesun(double dx, double dy) {x+=dx; y+=dy;} // . . . }; class Kolo: public Punkt { protected: double R; Kolo(double x=0, double y=0, double R=1):Punkt(x, y), R(R) { } class Walec: public Kolo { protected: double h; Walec(double x=0, double y=0, double R=1, double h=1): Kolo(x, y, R), h(h) { } PO7-12 / 29

Przykład Walec X(0,0,1,5); // x=0, y=0, R=1, h=5 Punkt P; X.przesun(1,2); // aktywacja funkcji z klasy Punkt P=X; // standardowa konwersja - przypisanie x=1, y=2 do P Konwersje definiowane: Kolo::Kolo(Punkt &P): Punkt(P), R(1) { } Walec::Walec(Kolo &K): Kolo(K), h(1) { } Konwersje nie nakładają się automatycznie Punkt P(10,20); Kolo K=P; // konwersja domyślna (Kolo)P Walec X=(Kolo)P; // konwersja domyślna (Walec) PO7-13 / 29

Konflikt nazw Zdefiniowanie w klasie Walec funkcji void przesun(double dx, double dy, double dh) {x+=dx; y+=dy; h+=dh;} przesłania w klasie Walec funkcję z klasy Punkt. Do przesłoniętych zmiennych i funkcji można się odwołać za pomocą operatora kwalifikacji klasy. Np. Walec X(0,0,1,5); Punkt P(10, 20); P.przesun(1,2); // funkcja z klasy Punkt X.przesun(1,2,3); // funkcja z klasy Walec X.przesun(1,2); // błąd X.Punkt::przesun(1,2); // funkcja z klasy Punkt PO7-14 / 29

Dziedziczenie wielobazowe (wielodziedziczenie) diagram dziedziczenia, konstruktory klas pochodnych, przykład dziedziczenia, dziedziczenie wirtualne, konflikt nazw. PO7-15 / 29

Diagram dziedziczenia Klasa A oraz klasa B są klasami bazowymi dla klasy C. Klasa C ma dwie klasy bazowe. Klasa C może mieć wiele klas bazowych. Klasa A Klasa B Klasa C class A{ /* deklaracje */ }; class B{ /* deklaracje */ }; class C:public A,public B{ /* deklaracje */ }; PO7-16 / 29

Organizacja obiektów Obiekty klas bazowych są polami obiektu klasy pochodnej. Konstruktory obiektów klas bazowych są wywoływane w kolejności takiej, w jakiej podano te klasy w definicji klasy pochodnej. Kolejność występowania konstruktorów w liście inicjacyjnej konstruktora klasy pochodnej nie ma znaczenia. Obiekt klasy A Pola klasy A Obiekt klasy B Pola klasy B Obiekt klasy C Pola klasy C Podobiekt A Podobiekt klasy B Konstruktor klasy C C::C( /*parametry*/ ): A( /*…*/ ), B( /*…*/ ) { /* treść konstruktora */ } PO7-17 / 29

Usuwanie obiektów Obiekt klasy C Pola klasy C Podobiekt A Podobiekt klasy B Aktywowanie destruktora ~C( ) do obiektu klasy C Podobiekt klasy B Podobiekt A Aktywowanie destruktora ~B( ) do podobiektu klasy B Aktywowanie destruktora ~A( ) do podobiektu klasy A PO7-18 / 29

Przykład dziedziczenia Silnik Odbiornik prądu Silnik elektryczny class Silnik{ /* deklaracje */ }; class OdbPradu{ /* deklaracje */ }; class SilnikEl:public Sinik,public OdbPradu{ /* deklaracje */ }; PO7-19 / 29

Dziedziczenie wielokrotne Klasa Q Klasa A Klasa B Klasa D class Q{ /* definicje zmiennych i funkcji klasy Q */ } ; class A: public Q { /* . . . klasy A */ } ; class B: public Q { /* . . . klasy B */ } ; class D: public A, public B { /* . . . klasy D */ } ; PO7-20 / 29

Budowa obiektu class Q{ /* ... */ } ; class A: public Q { /* ... */ } ; class B: public Q { /* ... */ } ; class D: public A, public B { /* ... */ } ; D x; // definicja obiektu x z klasy D D A B A::Q B::Q Pola klasy Q Pola klasy A Pola klasy B Pola klasy D Przykład budowy obiektu klasy D Konstruktor klasy D D::D( /*parametry*/ ): A( /*…*/ ), B( /*…*/ ) { /* treść konstruktora */ } PO7-21 / 29

Dziedziczenie wirtualne Klasa V v v Klasa A Klasa B Klasa D class V{ /* definicje zmiennych i funkcji klasy V */ } ; class A: virtual public V { /* . . . klasy A */ } ; class B: virtual public V { /* . . . klasy B */ } ; class D: public A, public B { /* . . . klasy D */ } ; PO7-22 / 29

Budowa obiektu class V{ /* ... */ } ; class A: virtual public V { /* ... */ } ; class B: virtual public V { /* ... */ } ; class D: public A, public B { /* ... */ } ; D x; // definicja obiektu x z klasy D D A B A , B V Pola klasy A Pola klasy B Pola klasy D Pola klasy V Przykład budowy obiektu klasy D Konstruktor klasy D D::D( /*parametry*/ ): A( /*…*/ ), B( /*…*/ ), V( /*…*/ ) { /* treść konstruktora */ } PO7-23 / 29

Dziedziczenie wirtualne Klasa V Klasa Q v v Klasa A Klasa B Klasa D class V{ /* definicje zmiennych i funkcji klasy V */ } ; class Q{ /* definicje zmiennych i funkcji klasy Q */ } ; class A: virtual public V, public Q { /* . . . klasy A */ } ; class B: virtual public V, public Q { /* . . . klasy B */ } ; class D: public A, public B { /* . . . klasy D */ } ; PO7-24 / 29

Budowa obiektu class V{ /* ... */ int k, n; } ; class Q{ /* ... */ int p, s; } ; class A: virtual public V, public Q { /* ... */ } ; class B: virtual public V, public Q { /* ... */ } ; class D: public A, public B { /* ... */ int p, n; } ; D x; // definicja obiektu x z klasy D D A B A , B A::Q B::Q V Pola klasy Q Pola klasy A Pola klasy B Pola klasy D Pola klasy V Przykład budowy obiektu klasy D PO7-25 / 29

Dostęp do zmiennych p s n k class V{ /* ... */ int k, n; } ; class Q{ /* ... */ int p, s; } ; class A: virtual public V, public Q { /* ... */ } ; class B: virtual public V, public Q { /* ... */ } ; class D: public A, public B { /* ... */ int p, n; } ; D x; // definicja obiektu x z klasy D Obiekt x A B A , B A::Q B::Q V p s Pola klasy A Pola klasy B n k x .A::s x .B::s x .p x .n x .V::n x .A::p x .B::p x .k PO7-26 / 29

Konflikt nazw funkcji class Silnik { /* ... */ public: double Sprawnosc( ); } ; class OdbPr { /* ... */ public: double Sprawnosc( ); } ; class SilnikEl: public Silnik, public OdbPr { /* ... */ } ; main( ) { SilnikEl x; // definicja obiektu x z klasy SilnikEl double S; S=x.Sprawnosc( ); // błąd!! – o którą funkcję chodzi? // Silnik::Sprawnosc( ) czy OdbPr::Sprawnosc( ) /* ... */ } PO7-27 / 29

Konstruktory Podobiekty klas bazowych muszą być inicjowane na liście inicjacyjnej. V::V(/* ... */) { /* instrukcje konstruktora */ } Q::Q(/* ... */) { /* instrukcje konstruktora */ } A::A(/* ... */):V(/* ... */), Q(/* ... */) { /* instrukcje konstruktora */ } B::B(/* ... */):V(/* ... */), Q(/* ... */) { /* instrukcje konstruktora */ } PO7-28 / 29

Konstruktory V::V(/* ... */){ /* instrukcje konstruktora */ } Q::Q(/* ... */){ /* instrukcje konstruktora */ } A::A(/* ... */):V(/* ... */), Q(/* ... */) { /* instrukcje */ } B::B(/* ... */):V(/* ... */), Q(/* ... */) { /* instrukcje */ } Podobiekty klas dziedziczonych wirtualnie muszą być inicjowane niezależnie na liście inicjacyjnej. D::D(/* ... */):A(/* ... */), B(/* ... */), V(/* ... */) { /* instrukcje konstruktora */ } // Powyżej dodatkowa inicjacja podobiektu klasy V // dziedziczonej wirtualnie w klasie D. PO7-29 / 29