Zaawansowane programowanie w C++ (PCP)

Podobne dokumenty
Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w języku C++ Programowanie obiektowe

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

dr inż. Jarosław Forenc

Programowanie obiektowe w języku

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

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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

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

Dziedziczenie jednobazowe, poliformizm

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

TEMAT : KLASY DZIEDZICZENIE

Wykład 9: Polimorfizm i klasy wirtualne

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

Programowanie obiektowe i zdarzeniowe

Materiały do zajęć VII

Wykład 9: Metody wirtualne i polimorfizm

Programowanie obiektowe - 1.

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

Plik klasy. h deklaracje klas

C++ - [4-7] Polimorfizm

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

Dziedziczenie. dr Jarosław Skaruz

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

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

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

Wprowadzenie do programowanie obiektowego w języku C++

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

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Programowanie obiektowe

Programowanie obiektowe

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Kurs WWW. Paweł Rajba.

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

TEMAT : KLASY POLIMORFIZM

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

Zaawansowane programowanie w C++ (PCP)

Szablony funkcji i szablony klas

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

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

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

Język C++ Programowanie obiektowe

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

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

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

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

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

Programowanie Obiektowe i C++

Wstęp do Programowania 2

Dziedziczenie. Ogólna postać dziedziczenia klas:

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

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.

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

PARADYGMATY PROGRAMOWANIA Wykład 2

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

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

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

Wyliczanie wyrażenia obiekty tymczasowe

Wykład 8: klasy cz. 4

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

Wprowadzenie do szablonów szablony funkcji

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

Wprowadzenie do szablonów szablony funkcji

Dziedziczenie. Tomasz Borzyszkowski

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

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

Enkapsulacja, dziedziczenie, polimorfizm

Technologie i usługi internetowe cz. 2

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Zaawansowane programowanie w C++ (PCP)

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

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

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

Konstruktor kopiujacy

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

Podstawy Programowania Obiektowego

Polimorfizm. dr Jarosław Skaruz

10. Programowanie obiektowe w PHP5

Wykład 5 Okna MDI i SDI, dziedziczenie

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Mechanizm dziedziczenia

PROE wykład 4 pozostałe operatory, forward declaration, dziedziczenie. dr inż. Jacek Naruniec

Klasy abstrakcyjne i interfejsy

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe w C++ Wykład 12

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

PARADYGMATY PROGRAMOWANIA Wykład 3

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

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

Podstawy Programowania semestr drugi. Wykład czternasty

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

Wykład 6: Dziedziczenie

Zaawansowane programowanie w C++ (PCP)

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje w roku akademickim 2012/2013. Przedmioty kierunkowe

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Aplikacje w środowisku Java

Podstawy programowania III

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

Transkrypt:

Zaawansowane programowanie w C++ (PCP) Wykład 3 - polimorfizm. dr inż. Robert Nowak - p. 1/14

Powtórzenie Powtórzenie: klasy autonomiczne: konstruktor, konstruktor kopiujacy, operator przypisania, destruktor tworzenie nowych typów: dziedziczenie i agregacja dziedziczenie: nadpisywanie metod, problem przycinania, zasłanianie - p. 2/14

» Rozwiazanie: pole typu Zalety podejścia obiektowego: klasy autonomiczne enkapsulacja (ochrona składowych) konstrukcja i destrukcja polimorfizm - brak odpowiednika w podejściu strukturalnym. umożliwia definiowanie ogólnych cech pokrewnych typów; - p. 3/14

Problem typu dla obiektów» Rozwiazanie: pole typu Problem wołania właściwych metod dla obiektu, gdy używa się wskaźnika do obiektu klasy bazowej. class Osoba { void drukuj(ostream& os) const { os << osoba ; } class Pracownik : public Osoba { void drukuj(ostream& os) const { os << pracownik ; } void drukujosobe(const Osoba& f) { cout << f.drukuj(); } Osoba o; Pracownik p; drukujosobe(o);//wołana metoda Osoba::drukuj drukujosobe(p);//wołana metoda Osoba::drukuj - p. 4/14

Rozwiazanie: pole typu» Rozwiazanie: pole typu class Osoba { enum Typ { OSOBA, PRACOWNIK, KLIENT const Typ typ_;//pole pamięta typ obiektu Osoba() : typ_(osoba) {} class Pracownik : public Osoba { Pracownik() : typ_(pracownik) {} void drukuj(const Osoba& o) { switch(o.typ)... } Bardzo złe rozwiazanie! kompilator nie potrafi sprawdzić poprawności kod staje się nieczytelny i trudno modyfikowalny - p. 5/14

Funkcje wirtualne» Rozwiazanie: pole typu Inne rozwiazanie problemu pola typu, wspierane przez kompilator. class Osoba { virtual void drukuj(ostream& os) const { metoda jest wirtualna jeżeli w klasie bazowej jest poprzedzona słowem virtual metody sa nadpisywane (zastępowane) w klasie pochodnej maja identyczna sygnaturę w klasie pochodnej metoda może być (ale nie musi) poprzedzona słowem virtual class Pracownik : public Osoba { virtual void drukuj(ostream& os) const { os << pracownik ; - p. 6/14

» Rozwiazanie: pole typu kompilator wybiera najbardziej właściwa metodę (wśród nadpisywanych) wyjatek: jawne wskazanie funkcji, np. Prostokat::drukuj() nadpisywanie bardziej restrykcyjne niż przedefiniowywanie Zastosowania: umożliwia definiowanie ogólnych cech pokrewnych typów; można pisać ogólne funkcje działajace dla wszystkich pochodnych pewnej klasy bazowej; elastyczny system typów: można dodawać nowe typy bez modyfikacji już istniejacego kodu; Znajdowanie cech wspólnych dla typów nie jest prostym zadaniem. Mechanizm funkcji wirtualnych w innych językach programowania i w C++. - p. 7/14

Późne wiazanie» Rozwiazanie: pole typu class A { virtual void f(){ virtual void g(){ private: //SkladoweA class B : public A { virtual void f(){ virtual void g(){ private: //SkladoweB A a; B b; A* pa = b; pa->f(); obiekta vtbl składowea obiektb vtbl składowea składoweb &A::f &A::g &B::f &B::g Późne wiazanie (narzuty) pamięciowe: jeden wskaźnik w obiekcie (vtbl) czasowe: jeden skok więcej - p. 8/14

Destruktor» Rozwiazanie: pole typu Jeżeli klasa jest klasa bazowa, to powinna mieć wirtualny destruktor! class Bazowa { class Pochodna : public Bazowa { Bazowa* ptr = new Pochodna(); delete ptr;//błąd! Wywoła się destruktor dla bazowa. class Bazowa2 { virtual Bazowa2(){} class Pochodna2 : public Bazowa2 { Bazowa2* ptr2 = new Pochodna2(); delete ptr2;//wywoła się destruktor dla Pochodna2 - p. 9/14

» Rozwiazanie: pole typu funkcje wirtualne, późne wiazanie kompilator wybiera najbardziej właściwa metodę (wśród nadpisywanych) wyjatek: jawne wskazanie funkcji, np. Prostokat::drukuj() Zastosowania: umożliwia definiowanie ogólnych cech pokrewnych typów; można pisać ogólne funkcje działajace dla wszystkich pochodnych pewnej klasy bazowej; elastyczny system typów: można dodawać nowe typy bez modyfikacji już istniejacego kodu; Znajdowanie cech wspólnych dla typów nie jest prostym zadaniem. - p. 10/14

Klasy abstrakcyjne» Rozwiazanie: pole typu Klasy abstrakcyjne: klasy, które maja sens jedynie jako interfejs (klasa bazowa) nie można dostarczyć sensownej implementacji metod wirtualnych nie powinny być tworzone obiekty takiej klasy często reprezentuje abstrakcyjne pojęcie Funkcje czysto wirtualne: class Figura { virtual void rysuj() = 0; Jeżeli klasa zawiera funcje czysto wirtualne to jest klasa abstrakcyjna. kompilator nie dopuszcza do tworzenia obiektów takich klas wykrywany bład obcinania już na etapie kompilacji! - p. 11/14

Hierarchie klas» Rozwiazanie: pole typu class Figura { virtual void rysuj() = 0; virtual bool czywypukla() = 0; class Wielokat : public Figura { virtual bool czywypukla(){ return true;} protected: std::vector<point> wierz_; class Prostokat : public Wielokat { virtual void rysuj();//implementacja Figura Koło Wielokąt Złożona Trójkąt Prostokąt - p. 12/14

Interfejsy» Rozwiazanie: pole typu Klasa abstrakcyjna: nie musi dostarczać konstruktorów stanowi interfejs dla swoich klas pochodnych, tzn. określamy metody jakie te klasy musza implementować bardzo wygodne rozdzielenie interfejsu od implementacji Czysty interfejs: klasa abstrakcyjna składajaca się głównie z funkcji czysto wirtualnych nie przechowuje stanu tylko określa interfejs - p. 13/14

Właściwości klasy bazowej» Rozwiazanie: pole typu Klasa wartość (klasa autonomiczna): brak metod wirtualnych konstruktor, konstruktor kopiujacy, operator przypisania, destruktor najczęściej obiekt automatyczny lub składowa klasy przekazywany przez wartość lub stała referencję Klasa bazowa dla hierarchii klas: używa metod wirtualnych, powinna mieć wirtualny destruktor najlepiej gdy abstrakcyjna albo prywatny konstruktor kopiujacy i operator przypisania (zapobiega wycinaniu) najczęściej obiekt na stercie przekazywana przez wskaźnik lub referencję - p. 14/14