Programowanie obiektowe w języku

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

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

Dziedziczenie. Ogólna postać dziedziczenia klas:

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

PARADYGMATY PROGRAMOWANIA Wykład 4

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

Wprowadzenie do programowanie obiektowego w języku C++

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

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

Mechanizm dziedziczenia

Zaawansowane programowanie w C++ (PCP)

private - oznacza, że wszystkie elementy klasy bazowej zmieniają się w prywatne.

Programowanie Obiektowe i C++

Enkapsulacja, dziedziczenie, polimorfizm

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

dr inż. Jarosław Forenc

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. dr Jarosław Skaruz

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Programowanie obiektowe i zdarzeniowe

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

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe w C++ Wykład 12

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

Mechanizm dziedziczenia

Materiały do zajęć VII

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

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

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.

Klasy abstrakcyjne, interfejsy i polimorfizm

Dziedziczenie jednobazowe, poliformizm

Podstawy Programowania Obiektowego

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

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

Plik klasy. h deklaracje klas

.NET Klasy, obiekty. ciąg dalszy

Technologie i usługi internetowe cz. 2

Podstawy programowania obiektowego

Programowanie obiektowe

Wykład 8: klasy cz. 4

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

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

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

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

Dziedziczenie. dr Jarosław Skaruz

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

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

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

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

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

C++ - [4-7] Polimorfizm

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

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

TEMAT : KLASY DZIEDZICZENIE

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

TEMAT : KLASY POLIMORFIZM

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

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

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

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

PARADYGMATY PROGRAMOWANIA Wykład 2

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

Język C++ Programowanie obiektowe

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

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

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

Zaawansowane programowanie w C++ (PCP)

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

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

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

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

Programowanie obiektowe

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

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

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

Dokumentacja do API Javy.

Podstawy Języka Java

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

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

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

Wykład 9: Metody wirtualne i polimorfizm

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

Programowanie obiektowe

Aplikacje w środowisku Java

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

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

Interfejsy i klasy wewnętrzne

Programowanie Obiektowe i C++

Programowanie 2. Język C++. Wykład Relacje między klasami, klasy zagnieŝdŝone, klasy lokalne

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Języki programowania imperatywnego

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Abstrakcyjny typ danych

Java Język programowania

Transkrypt:

Programowanie obiektowe w języku C++ Stanisław Gepner sgepner@meil.pw.edu.pl

Dziedziczenie Wstęp Zacznijmy od przykładu Przykład rolniczy Każde zwierzątko wydaje dźwięk Każde się tak samo porusza Musimy traktować oddzielnie - kłopotliwe Nie możemy na problem spojrzeć abstrakcyjnie Mechanizm, który pozwoli nam połączyć zwierzątka

Dziedziczenie Wstęp Kolejne klasy rozszerzają możliwości już istniejących Pozwala tworzyć nowe klasy w oparciu o już istniejące Współdzielenie kodu (nasza metoda chodz()) Łatwiejsze zarządzanie Umożliwia hierarchię klas, np.: kształty prostokąty kwadraty Klasę po której dziedziczymy nazywamy bazową Klasę dziedziczącą nazywamy pochodną Obiekt klasy pochodnej, jest jednocześnie obiektem klasy bazowej, ale nie odwrotnie albo obiekt klasy bazowej jest subobiektem klasy pochodnej (Pochodna ma w sobie bazowy)

Składnia class nazwa :[ operator_widocznosci ] nazwa_klasy_bazowej // na razie { // definicja_klasy Operator widoczności może być: public, protected, private B dziedziczy po A class A { class B : public A { // operator public A B

Składnia protected Operator widoczności protected powoduje, że atrybuty klasy bazowej, mogą być swobodnie używane w klasie dziedziczącej ale poza klasą nią i klasą bazową nie są widoczne (jak private). class A{ int a; protected : int b; private : int c; class B: public A{ void fun (){a=8; b=4; c=5;} // c jest private! int main (){ B b; b. fun (); cout << b.a << " " << b.b << " " << b.c << endl ; }

Składnia Operator widoczności public bez zmian public public protected protected private brak dostępu protected public zmienia się w protected public protected protected protected private brak dostępu private wszystko zmienia się w private public private protected private private brak dostępu brak operatora domyślnie private

sizeof Tablice class A{ char taba [1024]; int a; class B : public A{ char tabb [1024]; int b; A a; B b; cout << sizeof (a) <<" " << sizeof (b) << endl ; A tab [2]; tab [0] = B(); tab [1] = A(); // zadziala, ale tab [0]. a = 5; tab [0]. b = 5; //? tab [1]. a = 6; Obiekt klasy pochodnej zawiera w sobie subobiekt klasy bazowej Jaka jest odległość między tab[0] i tab[1]? Czy zmieści sie tam obiekt klasy B? Należy uzywać tablicy wskaźników!

Dostęp do atrybutów class Bydle { void jedz (); class kura : public bydle { void gdacz (); class krowa : public bydle { void mucz (); kura k; // instancja k. jedz () k. gdacz () krowa * pk = new krowa (); pk -> jedz (); // pointer pk -> mucz (); Krowa muczy, kura gdzcze Kura i krowa mogą jeść przykład bydle * tab [2]; tab [0] = new kura (); tab [1] = new krowa (); tab [0] - > jedz (); tab [1] - > jedz (); bydle * pb = pk;// rzutowanie pk -> jedz (); pb = &k; k-> jedz (); (( bydle )k). jedz ();

Wielodziedziczenie Diament B A D C Język C++ umożliwia wielodziedziczenie Może to powodować pewne komplikacje - diament Jak D zawiera A? Jaki jest rozmiar D? Jak jednoznacznie dostać się do atrybutów A Dziedziczenie wirtualne class A { char buff [1024]; void show () {} class B: public A { class C: public A { class D: public A, public B {

Wielodziedziczenie Dziedziczenie wirtualne B A D C class A { char buff [1024]; void show () {} class B: public virtual A { class C: public virtual A { class D: public A, public B { D w jednoznaczny sposób zawiera A D ma odpowiedni rozmiar Odwołania do atrybutów A są jednoznaczne

Przykrywanie metod class Bydle { void jedz (); void dzwiek (){/*?*/} class kura : public bydle { void dzwiek (){cout <<" KoKoKo " << endl ;} // void gdacz (); class krowa : public bydle { void dzwiek (){cout <<" Muuu " << endl ;} // void mucz (); kura k; k. dzwiek () krowa a; a. dzwiek ; bydle *p = new krowa (); p-> dzwiek (); //?? bydle * tab [2]; tab [0] = new kura (); tab [1] = new krowa (); tab [0] - > dzwiek (); tab [1] - > dzwiek (); Zaczynamy unifikować nasze podejście Nie interesuje nas czym dokładnie jest bydle Co jest wywołane, kiedy i dlaczego? Przykład

Funkcje wirtualne class Bydle { void jedz (); virtual void dzwiek (){/*?*/} class kura : public bydle { virtual void dzwiek () {cout <<" KoKoKo " << endl ;} // void gdacz (); class krowa : public bydle { virtual void dzwiek () {cout <<" Muuu " << endl ;} // void mucz (); kura k; k. dzwiek () krowa a; a. dzwiek ; bydle *p = new krowa (); p-> dzwiek (); //?? bydle * tab [2]; tab [0] = new kura (); tab [1] = new krowa (); tab [0] - > dzwiek (); tab [1] - > dzwiek (); Pozwala na wywołanie prawidłowej metody tzn. metody klasy pochodnej z poziomu bazowej Funkcja nie jest dowiązana w czasie kompilacji, a w momencie wykonania programu - late linking Koszt pamięciowy i czasowy nie jeżeli dostajemy się rzutując na obiekt klasy pochodnej

Konstrukto Destruktor Kolejność wywoływania class A{ A(){cout <<"A" << endl ;} A( int a) {} virtual ~A() {} class B : public A{ B() : A() {cout <<"B" << endl ;} B( int a) : A(a) {} virtual ~B() {} A a, a2 (9) ; B b, b1 (2) ; Subobiekt klasy bazowej musi istnieć zanim powstanie obiekt dziedziczący Konstruktor obiektu klasy bazowej musi zostać wywołany w liście inicjalizacyjnej Destruktory powinny być wirtualne, by zapewnić poprawne zwalnianie pamięci Częste pytanie na rozmowach o pracę: Po co destruktor jest wirtualny? Konstruktor wywoływany jest od bazowej w dół Destruktor od pochodnej w górę (chyba, że nie jest wirtualny)

Metoda abstrakcyjna class A{ virtual void fun () = 0; class B : public A{ virtual void fun () {} Metoda nie musi posiadać ciała w klasie bazowej bo możemy nie wiedzieć jak ją zrealizować stosunek ovwodu do pola w kształcie? deklaracja = 0; Można wywołać taką metodę w klasie bazowej! Klasa posiadająca przynajmniej jedna metodę abstrakcyjną staje się klasą abstrakcyjną i nie można stworzyć już obiektu tej klasy! Trzeba dziedziczyć i implementować wszystkie metody abstrakcyjne

Uniemożliwienie dziedziczenia Przed C++11 kłopotliwe Prywatny konstruktor Dodać do klasy statyczną metodę tworzącą instancję Nieczytelne Dla każdego konstruktora musi byc metoda Kompilator zgłosi błąd dopiero przy instantacji klasy class A{ private : A(); static A* zroba () { return new A() ;} class B: public A { int main (){ // B b; // konstruktor prywatny A* pa = A:: zroba (); delete pa; return 0; }

Uniemożliwienie dziedziczenia C++11 wprowadza słówko final jak w Java? class A final { A(); class B: public A { int main (){ }

Lepsza farma Przykład Zakończymy przykładem bydle krowa kon osiol kura mul