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

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Programowanie obiektowe
Klasy abstrakcyjne i interfejsy
Programowanie obiektowe PO PO - LAB 2 Wojciech Pieprzyca.
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe PO PO - LAB 3 Wojciech Pieprzyca.
Metody wirtualne.
Wzorce.
Static, const, volatile.
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
Programowanie w środowisku sieciowym
Programowanie obiektowe w Javie
OOP - programowanie zorientowane obiektowo w VB.NET
Struktury.
Dziedziczenie i jego rodzaje
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
Klasy w C++. Deklaracja klasy class NazwaTwojejKlasy { //w tym miejscu piszemy definicje typów, //zmienne i funkcje jakie mają należeć do klasy. }; //tutaj.
Podstawy programowania II
Obiekty dynamiczne Tworzenie klas 3 MPDI Programowanie obiektowe W4.
Podstawy programowania II
T: Różnice pomiędzy programowaniem strukturalnym a obiektowym
Programowanie obiektowe w C++
Programowanie obiektowe III rok EiT
Programowanie obiektowe III rok EiT
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Maciek Mięczakowski
Inicjalizacja i sprzątanie
Programowanie obiektowe
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 2013/2014
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.
Programowanie obiektowe Wykład 9 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/15 Dariusz Wardowski.
Paweł Starzyk Obiektowe metody projektowania systemów
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.
Programowanie Zaawansowane
Dziedziczenie Wykład 7 Dziedziczenie sekwencyjne
Partnerstwo dla Przyszłości 1 Lekcja 27 Klasy i obiekty.
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.
Partnerstwo dla Przyszłości 1 Lekcja 28 Dziedziczenie i rodzaje dziedziczenia.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Programowanie Obiektowe – Wykład 6
Kurs języka C++ – wykład 3 ( )
Wątki, programowanie współbieżne
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
(według:
Programowanie Obiektowe – Wykład 2
Kurs języka C++ – wykład 4 ( )
Zapis prezentacji:

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

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 2/14 Wirtualne destruktory class A { private: int* a; public: A(int _a) {a = new int(_a);} virtual ~A() {delete a;} }; class B: public A { private: double* b; public: B(int _a, double _b): A(_a){ b = new double(_b);} virtual ~B() {delete b;} }; Poprzedzenie destruktorów słowem virtua l 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. 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; }

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 3/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.

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 4/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();

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 5/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.

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 6/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.

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 7/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 { private: int x; protected: double y; public: int getX(); double getY(); };

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 8/14 protected class A { private: int x; protected: double y; public: int getX(); double getY(); }; class B: public A { public: void setY(double _y) { y = _y; } }; 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.

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 9/14 Klasa Rownoleglobok – macierzysta czy nie? class Rownoleglobok { private: double a; double h; double alfa; public: 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 ?

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 10/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.

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 11/14 Może jednak bez dziedziczenia? class Rownoleglobok { private: double a; double h; double alfa; public: double pole() const; double obwod() const; void zmienKat(double a); }; class Prostokat { private: double a; double h; public: 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.

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 12/14 Abstrakcyjna klasa macierzysta class AbstrRownoleglobok { private: double a; double h; public: 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 }; 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. 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ą).

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 13/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.

Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 14/14 Dziękuję za uwagę