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

Podobne dokumenty
tel Konsultacje www

Zaawansowane programowanie w języku C++ Programowanie obiektowe

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

TEMAT : KLASY POLIMORFIZM

dr inż. Jarosław Forenc

Plik klasy. h deklaracje klas

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM

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

Zaawansowane programowanie w C++ (PCP)

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

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

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

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.

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

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

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

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.

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

Mechanizm dziedziczenia

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

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

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

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

Zaawansowane programowanie w C++ (PCP)

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Programowanie obiektowe w C++ Wykład 12

Programowanie obiektowe w języku

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

PARADYGMATY PROGRAMOWANIA Wykład 2

C++ - [4-7] Polimorfizm

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

Wprowadzenie do programowanie obiektowego w języku C++

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 12

Programowanie obiektowe

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

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

TEMAT : KLASY DZIEDZICZENIE

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

Programowanie obiektowe język C++

Listy powiązane zorientowane obiektowo

Mechanizm dziedziczenia

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

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Wstęp do programowania obiektowego, wykład 7

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

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

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

Polimorfizm w pigułce

Programowanie obiektowe

Dziedziczenie jednobazowe, poliformizm

Wykład 9: Metody wirtualne i polimorfizm

Programowanie obiektowe i zdarzeniowe

Wyjątki (exceptions)

Laboratorium 1 - Programowanie proceduralne i obiektowe

Wykład 5 Okna MDI i SDI, dziedziczenie

Dziedziczenie. Ogólna postać dziedziczenia klas:

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

class Samochod { void Ruch(); }; class Amfibia : public Samochod { void Ruch(); // amfibie pływają };

Programowanie obiektowe i C++ dla matematyków

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

Owad():waga(1),jadowitosc(false) {cout<<"konstruktor domyslny owada\n";}

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

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

Podstawy programowania obiektowego

Programowanie, część I

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Języki i metody programowania Java Lab2 podejście obiektowe

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

Programowanie obiektowe

Programowanie Obiektowe i C++

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

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

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Materiały do zajęć VII

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

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

Wprowadzenie do programowanie obiektowego w języku C++

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

Wstęp do Programowania 2

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

Programowanie Obiektowew języku C++ Zadania L4

Programowanie Obiektowe i C++

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

Wykład 5: Klasy cz. 3

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

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

Polimorfizm. dr Jarosław Skaruz

Technologie cyfrowe semestr letni 2018/2019

Programowanie - wykład 4

Programowanie Obiektowew języku C++ Zadania L9

PARADYGMATY PROGRAMOWANIA Wykład 3

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

Programowanie, część I

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Transkrypt:

Języki Programowania Prowadząca: dr inż. Hanna Zbroszczyk e-mail: gos@if.pw.edu.pl tel: +48 22 234 58 51 Konsultacje: piątek: 12.00 13.30 www: http://www.if.pw.edu.pl/~gos/students/jp Politechnika Warszawska Wydział Fizyki Pok. 117b (wejście przez 115) 1

ATD 2

Abstrakcyjne typy danych (ATD) - I ATD (inaczej klasy abstrakcyjne), to takie klasy, które nie reprezentują żadnego konkretnego obiektu. Klasa abstrakcyjna istnieje tylko po to, aby ją dziedziczyć.. Jak zatem uczynić klasę abstrakcyjną? class samochod{ ; protected: string kolor; double cena; public: samochod(string str="", double c = 0.0) : kolor(str), cena(c) { virtual ~samochod() { void virtual opis() = 0; class osobowy: public samochod { ; protected: int ilosc_osob; public: osobowy(string str="", double c=0.0, int o = 0): samochod(str, c), ilosc_osob(o) { ~osobowy() { void opis(); 3

Abstrakcyjne typy danych (ATD) - II void ciezarowy::opis() {... void osobowy::opis() {... int main() { //samochod s("czerwony", 30000); //ZLE! osobowy o("zielony", 40000, 5); samochod *wsk = &o; wsk->opis();... Jeśli klasa jest abstrakcyjna, tzn, że nie będzie wykonywana jej funkcja składowa. void virtual opis() = 0; jest funkcją czysto wirtualną (ang. pure virtual). Możliwe jest wykonanie funkcji opis() z klasy pochodnej, ale nie podstawowej. Jeśli nie zostanie dodane = 0, tzn, że funkcją wirtualna nie jest czysto wirtualną i możliwe jest (nawet jeśli nie zamierzamy) tworzenie obiektów z takiej klasy. Uczynienie funkcji wirtualnej czysto-wirtualną gwarantuje, że żaden obiekt takiej klasy nie będzie mógł powstać. 4

Abstrakcyjne typy danych (ATD) - III Jeśli w klasie abstrakcyjnej jest składowa funkcja wirtualna (ale nie czysto-wirtualna) void virtual funkcja(); to w sytuacji, kiedy w klasie pochodnej nie zostanie zdefiniowana funkcja() zostanie odziedziczona jej wirtualna wersja z klasy podstawowej. Jeśli natomiast w klasie abstrakcyjnej jest czysto-wirtualna funkcja składowa void virtual funkcja() = 0; To w sytuacji, kiedy w klasie pochodnej nie zostanie zdefiniowana funkcja() zostanie odziedziczona jej czysto-wirtualna wersja z klasy podstawowej, co będzie skutkowało tym, że klasa pochodna stanie się także klasą abstrakcyjną. 5

WIRTUALNY DESTRUKTOR 6

Wirtualny destruktor - I Jeśli w klasie jest choćby jedna funkcja wirtualna (niekoniecznie czysto-wirtualna), to destruktor w klasie także powinien być wirtualny. Wynika to z faktu, że kiedy wskaźnikiem klasy podstawowej pokazujemy na obiekt klasy pochodnej, po czym chcemy dany obiekt (poprzez wskaźnik na niego pokazujący) unicestwić, to należy użyć destruktora z klasy, z jakiej obiektem pracowaliśmy. Nie w każdej klasie ma sens tworzenie wirtualnego konstruktora z powodu oszczędności miejsca w pamięci (obiekt klasy z funkcją wirtualną jest większy) oraz czasu wykonywania programu (powiązanie danego obiektu z odpowiednim destruktorem na etapie wykonywania programu jest dłuższe niż jego powiązanie na etapie wiązania wczesnego) Wirtualny destruktor w klasie podstawowej gwarantuje, że we wszystkich klasach pochodnych destruktor będzie także wirtualny. W przypadku, kiedy destruktor w klasie podstawowej uczynimy czysto-wirtualnym, a w klasie pochodnej nie zdefiniujemy destruktora, to klasa pochodna stanie się klasą abstrakcyjną oraz niemożliwym będzie kreacja jakiegokolwiek jej obiektu. 7

Wirtualny destruktor program - I #include <iostream> using namespace std; class figura{ ; public: figura() { cout<<"konstruktor figury.."<<endl; virtual ~figura() { cout<<"destruktor figury.." <<endl; double virtual pole() { return -1; class kolo: public figura { ; protected: double *r; public: kolo(double=0.0); kolo(const kolo &); kolo& operator=(const kolo &); ~kolo(); double pole() { return (PI * *r * *r); class prostokat: public figura { ; protected: double *a; double *b; public: prostokat(double=0.0, double=0.0); prostokat(const prostokat &); prostokat& operator=(const prostokat &); ~prostokat(); double pole() { return (*a * *b); kolo::kolo(double a) { r = new double; *r = a; cout<<"konstruktor kola.."<<endl; 8

Wirtualny destruktor program - II kolo::kolo(const kolo &tmp) { r = new double; *r = *tmp.r; cout<<"konstruktor kola.."<<endl; kolo& kolo::operator=(const kolo &tmp){ if (&tmp==this) return *this; delete r; r = new double; *r = *tmp.r; return *this; kolo::~kolo() { delete r; cout<<"destruktor kola.."<<endl; prostokat::prostokat(double m, double n) { a = new double; b = new double; *a = m; *b = n; cout<<"konstruktor prostokata.."<<endl; prostokat::prostokat(const prostokat &tmp) { a = new double; b = new double; *a = *tmp.a; *b = *tmp.b; cout<<"konstruktor prostokata.."<<endl; prostokat& prostokat::operator=(const prostokat &tmp){ if (&tmp==this) return *this; delete b; delete a; a = new double; b = new double; *a = *tmp.a; *b = *tmp.b; return *this; prostokat::~prostokat() { delete b; delete a; cout<<"destruktor prostokata.."<<endl; 9

Wirtualny destruktor program - III int main() { cout<<endl; figura *f = new figura; cout<<"pole figury: "<<f->pole()<<endl<<endl; //ujemne figura *k = new kolo(4.0); cout<<"pole kola: "<<k->pole()<<endl<<endl; //50.24 figura *p = new prostokat(2.0, 3.0); cout<<"pole prostokata: "<<p->pole()<<endl; //6 cout<<endl; delete p; cout<<endl; delete k; cout<<endl; delete f; return 1; 10

Zalety dziedziczenia podsumowanie 1 Dziedziczenie jest jedną z największych zalet obiektowo orientowanych języków programowania. 1) Oszczędność pracy Kiedy należy zdefiniować nową klasę, podobną do tej, jaką już mamy zdefiniowaną, wystarczy zdefiniować jedynie różnice, nie trzeba definiować klasy od nowa. Nie jest konieczna znajomość kodu źródłowego klasy podstawowej, przy dziedziczeniu akceptujemy to, co zawiera klasa podstawowa lub zasłaniamy odziedziczone składniki zdefiniowanymi na nowo w klasie pochodnej. W klasie pochodnej definiujemy także nowe pola, które nie istniały w klasie podstawowej. 2) Hierarchia Proces dziedziczenia umożliwia wprowadzenie relacji pomiędzy poszczególnymi klasami. Zamiast mnożenia nowych klas bazujemy na zdefiniowanych wcześniej:.. wywodzi się od.. Figura_geometryczna Dwuwymiarowa Trójwymiarowa Wielokąt Okrąg Czworokąt Trójkąt 11 Kwadrat Prostokąt Romb Równoległobok Trapez Równoboczny Równoramienny

Zalety dziedziczenia podsumowanie 2 3) Klasy ogólne Możliwe jest definiowanie takich klas, których obiektów nie będziemy tworzyć, natomiast klasy te przeznaczone są wyłącznie do dziedziczenia. Przykładem takiej klasy może być kolejka. Nie ma obiektu klasy kolejka, ale dopiero ludzie mogą w niej stać. Dziedziczenie to sposób definiowania nowych klas, który jednocześnie wprowadza pomiędzy klasami relacje. Dziedziczenie nie daje obiektom klas pochodnych żadnych dodatkowych praw wobec obiektów klasy podstawowej. Jeśli taki efekt ma być osiągnięty należy zadeklarować przyjaźń klasy podstawowej z klasą pochodną. 12

KONIEC WYKŁADU 9 13

Nieobowiązkowe zadania do wykonania 1. Zaprojektować i stworzyć Hurtownię ubrań. Podzielić produkty na kategorie: sportowe, codzienne, wieczorowe,... 2. Zaprojektować aptekę. Stworzyć klasę abstrakcyjną Lek oraz klasy pochodne: Przeziębienie, Witaminy, Dzieci. 14