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

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

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Programowanie obiektowe w języku

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

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

TEMAT : KLASY DZIEDZICZENIE

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

Zaawansowane programowanie w C++ (PCP)

Wprowadzenie do programowanie obiektowego w języku C++

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

Enkapsulacja, dziedziczenie, polimorfizm

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

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.

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

Dziedziczenie jednobazowe, poliformizm

Wykład 8: klasy cz. 4

Dziedziczenie. dr Jarosław Skaruz

Dziedziczenie. Ogólna postać dziedziczenia klas:

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

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

PARADYGMATY PROGRAMOWANIA Wykład 2

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

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

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

Wykład 5 Okna MDI i SDI, dziedziczenie

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

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Klasa dziedzicząca posiada wszystkie cechy klasy bazowej (plus swoje własne) dodawanie nowego kodu bez edycji (i ewentualnego wprowadzania

Technologie i usługi internetowe cz. 2

Mechanizm dziedziczenia

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

C++ - [4-7] Polimorfizm

Kurs WWW. Paweł Rajba.

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

Programowanie obiektowe - 1.

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

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

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

PHP 5 język obiektowy

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.

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Programowanie obiektowe i zdarzeniowe

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

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

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

Materiały do zajęć VII

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

.NET Klasy, obiekty. ciąg dalszy

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

Aplikacje w środowisku Java

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

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

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Język C++ Programowanie obiektowe

Plik klasy. h deklaracje klas

Programowanie obiektowe

Polimorfizm. dr Jarosław Skaruz

Mechanizm dziedziczenia

Klasy abstrakcyjne i interfejsy

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

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Do czego służą klasy?

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

Dokumentacja do API Javy.

Wykład 9: Polimorfizm i klasy wirtualne

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

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

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

TEMAT : KLASY POLIMORFIZM

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

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Abstrakcyjny typ danych

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

Zaawansowane programowanie w C++ (PCP)

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

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Wstęp do programowania obiektowego. Wykład 2

Programowanie obiektowe

Programowanie w Internecie. Java

Programowanie, część I

Programowanie, część I

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

dr inż. Jarosław Forenc

Wprowadzenie do programowanie obiektowego w języku C++

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

Wykład 9: Metody wirtualne i polimorfizm

Obiekty: co i jak. Wykonał: Piotr Pięda dla koła naukowego KNI

Szablony klas, zastosowanie szablonów w programach

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

Rozdział 4 KLASY, OBIEKTY, METODY

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

Aplikacje w środowisku Java

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

Wykład 4: Klasy i Metody

Transkrypt:

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

Wirtualne destruktory class A int* a; A(int _a) a = new int(_a);} virtual ~A() delete a;} class B: public A double* b; B(int _a, double _b): A(_a) b = new double(_b);} virtual ~B() delete b;} int main() A* wsk1 = new A(3); A* wsk2 = new B(4,2.9); delete wsk1; //działa destruktor ~A() delete wsk2; //działają kolejno //destruktory ~B(), ~A(). return 0; } Poprzedzenie destruktorów słowem virtual powoduje, że podczas destrukcji obiektu zostanie wywołany odpowiedni kod destruktora. Jeżeli wskaźnik (referencja) wskazuje na obiekt typu B, wówczas nastąpi wywołanie destruktora ~B() klasy potomnej, a następnie ~A() klasy macierzystej. Innymi słowy, wykorzystanie wirtualnych destruktorów zapewnia odpowiednią kolejność ich wywołania. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 2/14

Wiązanie statyczne i dynamiczne Wiązanie nazwy funkcji polega na określeniu odpowiedniego bloku wykonywalnego (w kodzie skompilowanym), który ma zostać użyty. Wiązanie statyczne to wiązanie, które jest realizowane podczas kompilacji kodu źródłowego. Wiązanie dynamiczne, to odpowiedni mechanizm, który pozwala wybrać odpowiednią metodę wirtualną podczas działania programu. Uwaga Wiązanie dynamiczne zachodzi wówczas, gdy odpowiednie metody wywoływane są przez wskaźniki lub referencje. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 3/14

Rzutowanie w górę Rzutowanie w górę jest to konwersja referencji (wskaźnika) do klasy potomnej na referencję (wskaźnik) do klasy macierzystej. Podczas dziedziczenia publicznego konwersja taka jest zawsze możliwa i zachodzi bez jawnego rzutowania typów. A* wsk = new B(3,4.5); A & ref = B(4,4.3); B b(3,4.5); A & ref = b; Wszelkie metody jakie można wykonywać na obiekcie klasy A, można wykonywać na obiekcie klasy B. Funkcja, której argumentem jest wskaźnik (referencja) do obiektu klasy A, będzie działać na obiekcie klasy B. Rzutowanie w górę jest przechodnie. Tzn. w przypadku, gdy klasa B dziedziczy z A, a klasa C dziedziczy z B, wówczas wskaźniki (referencje) do klasy A, mogą dotyczyć obiektów zarówno klasy B jak i C. A* a, b; a = new B(); b = new C(); dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 4/14

Rzutowanie w dół Rzutowanie w dół polega na konwersji referencji lub wskaźnika do klasy macierzystej na referencję lub wskaźnik do klasy potomnej. Rzutowanie w dół nie jest wykonywane bez jawnej konwersji typów. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 5/14

Funkcje wirtualne podsumowanie Jeżeli w deklaracji klasy daną metodę poprzedzimy słowem kluczowym virtual, wówczas metoda będzie metodą wirtualną w klasie macierzystej, potomnej i innych klasach dziedziczących po klasie potomnej. Jeżeli metoda wirtualna wywoływana jest na rzecz referencji lub wskaźnika, to program użyje tej wersji metody, która odpowiada typowi obiektu na który dana referencja czy wskaźnik wskazuje. Na metody wirtualne wybieramy te, które w klasach potomnych będą przedefiniowane. Jeżeli w którejś klasie potomnej nie zostanie przedefiniowana metoda wirtualna, wówczas obiekt tej klasy będzie korzystał z funkcji wirtualnej najbliższego przodka. Konstruktory nie mogą być metodami wirtualnymi, gdyż klasa potomna nie dziedziczy konstruktorów klasy macierzystej. Jeżeli dana klasa będzie stanowić klasę macierzystą, wówczas jej destruktory powinny być wirtualne. Funkcje zaprzyjaźnione nie mogą być wirtualne, gdyż nie są metodami klasowymi. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 6/14

Kontrola dostępu Do kontrolowania dostępu do pól składowych klasy stosujemy słowa kluczowe: public private protected Składowe chronione, czyli te które umieszczone są w sekcji protected, nadal dostępne są tylko dla metod tej samej klasy. Mogą być one udostępnione poza klasą tylko przy pomocy publicznych metod udostępniających te dane (analogiczne jak private). class A int x; protected: double y; int getx(); double gety(); dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 7/14

protected class A int x; protected: double y; int getx(); double gety(); Klasa B ma bezpośredni dostęp do składowej y. W wyniku metody sety(double) psuje się enkapuslacja tej zmiennej. Najlepiej umieszczać w sekcji protected te pola składowe, do których dostęp w klasie potomnej jest możliwy tylko za pomocą interfejsu publicznego klasy macierzystej. class B: public A void sety(double _y) y = _y; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 8/14

Klasa Rownoleglobok macierzysta czy nie? class Rownoleglobok double a; double h; double alfa; double pole() const; double obwod() const; void zmienkat(double a); Każdy prostokąt jest równoległobokiem, zatem czy jest sens klasę Prostokat wyprowadzić za pomocą dziedziczenia z klasy Rownoleglobok? dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 9/14

Relacja jest a dziedziczenie class Prostokat : public Rownoleglobok Wady klasy Prostokat: Do opisania prostokąta mamy trzy pola składowe (alfa zbędne, bo zawsze 90). Dziedziczona metoda zmienkat() nie ma dla prostokąta sensu, gdyż obiekt przestanie być prostokątem. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 10/14

Może jednak bez dziedziczenia? class Rownoleglobok double a; double h; double alfa; double pole() const; double obwod() const; void zmienkat(double a); class Prostokat double a; double h; double pole() const; double obwod() const; Deklaracja klasy Prostokat posiada już tylko te pola i metody składowe, które są potrzebne. Wydaje się jednak, że z uwagi na widoczny wspólny kod tych klas, można wprowadzić inne rozwiązanie. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 11/14

Abstrakcyjna klasa macierzysta Rozwiązanie to polega na wyodrębnieniu wspólnych cech tych klas i umieszczeniu ich w tzw. abstrakcyjnej klasie macierzystej, po której klasy Prostokat i Rownoleglobok będą dziedziczyły. class AbstrRownoleglobok double a; double h; AbstrRownoleglobok(double _a = 0, double _h = 0) : a(_a), h(_h) virtual ~AbstrRownoleglobok() double pole() const return a*h;} virtual double obwod() const = 0; //funkcja w pełni wirtualna Z uwagi na brak danych, nie można zaimplementować metody obwod(). Dodanie = 0 na końcu deklaracji metody wirtualnej powoduje, że metoda ta staje się w pełni wirtualna, a w konsekwencji klasa AbstrRowoleglobok jest abstrakcyjna (tzn. posiada co najmniej jedną metodę w pełni wirtualną). dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 12/14

Zastosowanie klas abstrakcyjnych Nie można tworzyć obiektów klasy abstrakcyjnej: AbstRownoleglobok ap; //błąd! AbstRownoleglobok * wsk; //OK Klasy abstrakcyjne służą jako klasy macierzyste, a więc tworzymy je po to by z nich dziedziczyć. class Rownoleglobok: public AbstRownoleglobok class Prostokat: public AbstRownoleglobok Mechanizm abstrakcyjnych klas macierzystych pozwala projektować hierarchię klas w sposób bardziej usystematyzowany i zdyscyplinowany. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 13/14

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