Programowanie obiektowe Wykład 7. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

Podobne dokumenty
Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

TEMAT : KLASY DZIEDZICZENIE

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Dziedziczenie. Ogólna postać dziedziczenia klas:

Wprowadzenie do programowanie obiektowego w języku C++

Mechanizm dziedziczenia

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Technologie i usługi internetowe cz. 2

Enkapsulacja, dziedziczenie, polimorfizm

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Programowanie 2. Język C++. Wykład 3.

Programowanie obiektowe Wykład 1. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

PARADYGMATY PROGRAMOWANIA Wykład 2

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

dr inż. Jarosław Forenc

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

TEMAT : KLASY POLIMORFIZM

Programowanie obiektowe

C++ - [4-7] Polimorfizm

Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 4

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Programowanie obiektowe w języku

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. Metody stałe w klasie

Materiały do zajęć VII

Podstawy programowania w języku C++ Zadania - dziedziczenie i polimorfizm

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Programowanie obiektowe

Plik klasy. h deklaracje klas

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Wykład 8: klasy cz. 4

Klasy abstrakcyjne i interfejsy

Podstawy Programowania Obiektowego

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Mechanizm dziedziczenia

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

Zaawansowane programowanie w języku C++ Klasy w C++

OBIEKTY PHP. G. Panuś

Aplikacje w środowisku Java

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Aplikacje w środowisku Java

Wykład 5 Okna MDI i SDI, dziedziczenie

Wyjątki (exceptions)

Dziedziczenie & W slajdach są materiały zapożyczone z

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

PHP 5 język obiektowy

Programowanie obiektowe w C++ Wykład 12

Dziedziczenie. dr Jarosław Skaruz

Projektowanie klas c.d. Projektowanie klas przykład

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Wstęp do Programowania 2

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. Metody stałe w klasie

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie Obiektowe i C++

Do czego służą klasy?

.NET Klasy, obiekty. ciąg dalszy

Dokumentacja do API Javy.

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Abstrakcyjny typ danych

Programowanie obiektowe

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Programowanie komputerowe. Zajęcia 7

Transkrypt:

Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

Relacja ma Przykłady relacji typu ma : Student ma nazwisko Wielokąt ma wierzchołki (punkty) Stos ma elementy Dla obiektów między którymi zachodzi relacja typu ma stosujemy technikę obudowywania, czyli tworzymy klasę złożoną z obiektów innych klas. class Wielokat private: int iloscwierzcholkow; TabPunktow wierzcholki; class TabPunktow private: int rozmiar; Punkt* tabp; class Punkt private: double x; double y; double getx(); double gety(); W przypadku techniki obudowywania (kompozycji), klasa Wielokat dziedziczy jedynie dostęp do implementacji, a nie do interfejsu obiektu klasy TabPunktow. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 2/20

Inicjalizacja obiektów wewnętrznych (obudowanych) Z uwagi na to, że klasy obudowujące obiekty nie dziedziczą interfejsów publicznych tych obiektów, nie można używad konstruktorów klasa tychże obiektów w sposób jawny, tylko przy pomocy listy inicjatorów. Przy czym na liście inicjatorów umieszczamy nazwy obiektów, a nie klas. class Wielokat private: int iloscwierzcholkow; TabPunktow wierzcholki; Wielokat(int iw, TabPunktow tp); Wielokat::Wielokat(int iw):wierzcholki(iw) iloscwierzcholkow = iw; class TabPunktow private: int rozmiar; Punkt* tabp; TabPunktow(int r) rozmiar = r; tabp = new Punkt[r]; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 3/20

Metody publiczne obiektu obudowanego Klasa obudowująca dany obiekt nie dziedziczy interfejsu publicznego, ale może z niego korzystad w metodach swojej klasy. class Wielokat private: int iloscwierzcholkow; TabPunktow wierzcholki; Wielokat(int iw, TabPunktow tp); void wypiszwierzcholki(); Wielokat::Wielokat(int iw):wierzcholki(iw) iloscwierzcholkow = iw; void Wielokat::wypiszWierzcholki() wierzcholki.wypisz(); class TabPunktow private: int rozmiar; Punkt* tabp; TabPunktow(int r) rozmiar = r; tabp = new Punkt[r]; void wypisz(); void TabPunktow::wypisz() for (int i=0; i<rozmiar; i++) cout << ( <<tabp[i].getx() <<, ; cout << tabp[i].gety()<< ) ; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 4/20

Dziedziczenie prywatne Dziedziczenie prywatne to inny sposób zaimplementowania relacji typu ma między dwiema klasami. Podczas dziedziczenia prywatnego zarówno publiczne jak i chronione składowe klasy macierzystej stają się prywatnymi składowymi klasy potomnej. W konsekwencji publiczne metody klasy macierzystej nie wchodzą w skład publicznego interfejsu obiektu, który dziedziczy. Metody te jednak mogą byd używane wewnątrz metod klasy potomnej. Zatem w przypadku dziedziczenia prywatnego klasa potomna nie dziedziczy interfejsu publicznego klasy macierzystej, ale dziedziczy jej implementację. class Wielokat : private TabPunktow Dziedziczenie prywatne jest domyślnym kwalifikatorem dostępu. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 5/20

Kompozycja klas a dziedziczenie prywatne Obudowanie (kompozycja) polega na dodaniu nazwanego obiektu do klasy, jako kolejnego pola składowego. Dziedziczenie prywatne natomiast dodaje obiekt do klasy, ale jako nienazwany obiekt dziedziczony (podobiekt). class Wielokat : private TabPunktow Wielokat(int iw); Zauważmy, że na liście inicjatorów konstruktora znajduje się nazwa klasy. Wielokat::Wielokat(int iw):tabpunktow(iw) dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 6/20

Kompozycja vs. dziedziczenie prywatne Zarówno technika obudowywania obiektu jak i technika dziedziczenia realizuje relację typu ma. Zatem który sposób jest lepszy? Zalety kompozycji Prostsza metoda. Jawnie nazwane obiekty obudowane. Można wykorzystad więcej niż jeden podobiekt tej samej klasy, podczas gdy dziedziczenie ogranicza nas do jednego. Zalety dziedziczenia prywatnego Dostęp do pól chronionych klasy macierzystej Możliwośd redefinicji funkcji wirtualnych. Przy kompozycji można wykorzystad więcej niż jeden podobiekt tej samej klasy, podczas gdy dziedziczenie ogranicza nas do jednego. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 7/20

Dziedziczenie chronione (protected) Podczas dziedziczenia chronionego, składowe publiczne i chronione klasy macierzystej stają się składowymi chronionymi klasy potomnej. W ten sposób dziedziczenie z klasy potomnej daje możliwośd klasie trzeciej generacji (tj. dziedziczącej po potomnej) dostęp do interfejsu publicznego klasy macierzystej. class A private: int x; protected: int y; int z; class B: protected A class C: private A Zmienne y i z stają się chronionymi składowymi klasy A. Zmienne y i z stają się prywatnymi składowymi klasy C. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 8/20

public potected private składowe klasy macierzystej public protected private składowe publiczne są składowymi publicznymi klasy potomnej składowymi chronionymi klasy potomnej składowymi prywatnymi klasy potomnej składowe chronione są składowymi chronionymi klasy potomnej składowymi chronionymi klasy potomnej składowymi prywatnymi klasy potomnej składowe prywatne są Dostępne poprzez interfejs publiczny klasy macierzystej Dostępne poprzez interfejs publiczny klasy macierzystej Dostępne poprzez interfejs publiczny klasy macierzystej dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 9/20

Dyrektywa using class A private: int x; int y; int getx(); int gety(); class B: private A int getx() return A::getX(); Klasa B udostępnia składową prywatna x klasy A poprzez opakowanie jednej funkcji drugą. Analogiczny efekt można uzyskad stosując dyrektywę using. class B: private A using A::getX; //bez nawiasów! Dyrektywa using udostępnia metodę getx() klasy A tak jakby była metodą publiczną klasy B pomimo dziedziczenia prywatnego. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 10/20

Dziedziczenie wielokrotne Dziedziczenie wielokrotne polega na dziedziczeniu z więcej niż jednej klasy macierzystej. Np.: class Dyrektor: public Pracownik, public Osoba class Banan: public Owoc, public Produkt class Student: public Osoba, private Wyniki class ChoryPacjent: public Chory, public Pacjent Analogicznie jak przy dziedziczeniu z jednej klasy macierzystej, wielokrotne dziedziczenie publiczne wyrazi relację typu jest, natomiast wielokrotne dziedziczenie prywatne wyrazi relację typu ma. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 11/20

Problemy ze wspólnym potomkiem Osoba Chory Pacjent ChoryPacjent dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 12/20

Klasa Osoba class Osoba private: char imie[20]; char nazwisko[20]; Osoba(); Osoba(const char* i, const char* n); Osoba(const Osoba & o); virtual ~Osoba() = 0; virtual void wprowadzdane(); virtual void pokaz() const; Osoba::Osoba() strcpy(imie,"brak"); strcpy(nazwisko,"brak"); Osoba::Osoba(const char* i, const char* n) strncpy(imie,i,20); strncpy(nazwisko,n,20); Osoba::Osoba(const Osoba & o) strcpy(imie,o.imie); strcpy(nazwisko,o.nazwisko); Osoba::~Osoba() void Osoba::wprowadzDane() cout << "Podaj imie: "; cin >> imie; cout << "Podaj nazwisko: "; cin >> nazwisko; void Osoba::pokaz() const cout << "Imie i nazwisko: " << imie << " " << nazwisko << endl; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 13/20

Klasa Chory class Chory: public Osoba private: char choroba[30]; Chory(); Chory(const char* i, const char* n, const char* c); Chory(const Osoba & o, const char* c); virtual void wprowadzdane(); virtual void pokaz() const; Chory::Chory() : Osoba() strcpy(choroba,"nierozpoznana"); Chory::Chory(const char* i, const char* n, const char* c) : Osoba(i,n) strncpy(choroba,c,30); Chory::Chory(const Osoba & o, const char* c) : Osoba(o) strncpy(choroba,c,30); void Chory::wprowadzDane() Osoba::wprowadzDane(); cout << "Rozpoznanie choroby: "; cin >> choroba; void Chory::pokaz() const Osoba::pokaz(); cout << "Rozpoznanie choroby: " << choroba << endl; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 14/20

Klasa Pacjent class Pacjent: public Osoba protected: int nrprzychodni; Pacjent() : Osoba(), nrprzychodni(0) Pacjent(const char* i, const char* n, int nr): Osoba(i,n), nrprzychodni(nr) Pacjent(const Osoba & o, int nr) : Osoba(o), nrprzychodni(nr) virtual void wprowadzdane(); virtual void pokaz() const; void Pacjent::wprowadzDane() Osoba::wprowadzDane(); cout << "Nr przychodni: "; cin >> nrprzychodni; void Pacjent::pokaz() const Osoba::pokaz(); cout << "Nr przychodni: " << nrprzychodni << endl; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 15/20

Klasa ChoryPacjent class ChoryPacjent: public Chory, public Pacjent Klas ChoryPacjent dwukrotnie dziedziczy po klasie Osoba, w konsekwencji dziedziczy dwa podobiekty Osoba, co jest powodem następującej niejednoznaczności: ChoryPacjent cp; Osoba* o = &cp; //błąd! Niejednoznaczne odwołanie do adresu Osoba Należy wskazad konkretny obiekt posługując się jawnym rzutowaniem: Osoba* o1 = (Chory *) &cp; Osoba* o2 = (Pacjent *) &cp; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 16/20

Wirtualna klasa macierzysta W celu rozwiązania problemu wielości kopii tych samych obiektów wewnątrz jednego (chory pacjent ma dwa imiona i dwa nazwiska), stosuje się tzw. wirtualne klasy macierzyste. Mechanizm wirtualnych klas macierzystych powoduje, że obiekty dziedziczące po wielu klasach współdzielących tę samą klasę macierzystą, dziedziczą tylko jeden obiekt tej wspólnej klasy. class Chory: virtual public Osoba class Pacjent: virtual public Osoba class ChoryPacjent: public Chory, public Pacjent W ten sposób obiekt ChoryPacjent zawiera tylko jedną kopię podobiektu Osoba. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 17/20

Problem z konstruktorem W dziedziczeniu wielokrotnym mechanizm polegający na wywoływaniu konstruktorów bezpośrednich klas macierzystych nie działa w przypadku macierzystych klas wirtualnych. //źle ChoryPacjent(const char* i, const char* n, char* c, int nr) : Chory(i,n,c), Pacjent(i, n, nr) Gdyby powyższy konstruktor był prawidłowy, informacje o imieniu i nazwisku do obiektu Osoba trafiłyby dwiema ścieżkami. Działanie takie jest blokowane, jeżeli klasa macierzysta jest wirtualną. Aby zainicjalizowad pola obiektu klasy macierzystej przed utworzeniem obiektów klas potomnych, należy wywoład odpowiedni konstruktor klasy macierzystej w sposób jawny. ChoryPacjent(const char* i, const char* n, char* c, int nr) : Osoba(i,n), Chory(i,n,c), Pacjent(i, n, nr) Jeżeli klasa dziedziczy z klas, które dziedziczą po wirtualnej klasie macierzystej, wówczas konstruktor tej pierwszej klasy musi jawnie wywoływad konstruktor tej drugiej klasy. (Uwaga dotyczy wywołania innego niż domyślnego konstruktora macierzystej klasy wirtualnej). dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 18/20

Niejednoznacznośd metod Dziedziczenie wielokrotne zazwyczaj prowadzi do niejednoznaczności wywołao funkcji. Najlepszym rozwiązaniem jest przedefiniowanie wszystkich metod w klasie, która dziedziczy z wielu klas macierzystych. W przedefiniowanych metodach przeważnie wskazujemy w sposób jawny, które wersje metod chcemy wywoład. Patrz kod. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 19/20

Dziękuję za uwagę dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 20/20