TEMAT : KLASY POLIMORFIZM

Podobne dokumenty
TEMAT : KLASY DZIEDZICZENIE

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

Plik klasy. h deklaracje klas

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

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

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;

Mechanizm dziedziczenia

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

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

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.

Programowanie obiektowe

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

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 :

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

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

Wstęp do programowania obiektowego, wykład 7

Wykład 5 Okna MDI i SDI, dziedziczenie

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 język C++

Wyjątki (exceptions)

Zwracanie obiektu. Funkcja może zwracać obiekty: #include"stdafx.h #include <iostream> using namespace std; class samp { inti; public:

Programowanie obiektowe w C++ Wykład 12

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

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.

Projektowanie klas c.d. Projektowanie klas przykład

Programowanie Obiektowew języku C++ Zadania L9

Wstęp do Programowania 2

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

Mechanizm dziedziczenia

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

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Techniki Programowania wskaźniki

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Polimorfizm w pigułce

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

Zaawansowane programowanie w C++ (PCP)

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

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

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

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Programowanie obiektowe w języku

Język C++ wykład VIII

Programowanie obiektowe i zdarzeniowe

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Operacje wejścia/wyjścia odsłona pierwsza

Listy powiązane zorientowane obiektowo

Polimorfizm. dr Jarosław Skaruz

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

string Rodzaj[4]= {"TV ", "wieza ", "DVD ", "kino "}; string Producent[4]={"Phillips", "Sony ", "Sanyo ", "Samsung "};

Środowisko programistyczne GEANT4

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

Podstawy Programowania Obiektowego

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

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

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

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

Pola i metody statyczne

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

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

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.:

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

Do czego służą klasy?

Programowanie obiektowe i C++ dla matematyków

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

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

Techniki Programowania wskaźniki 2

PARADYGMATY PROGRAMOWANIA Wykład 2

Technologie cyfrowe semestr letni 2018/2019

STL: Lekcja 1&2. Filozofia STL

Szablon klasy std::vector

C-struktury wykład. Dorota Pylak

Programowanie Obiektowew języku C++ Zadania L4

PARADYGMATY PROGRAMOWANIA Wykład 3

C-struktury wykład. Dorota Pylak

Informacja o programowaniu w c++ Dr Maciej Bobrowski

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

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

Podstawy algorytmiki i programowania - wykład 5 C-struktury cd.

C++ - [4-7] Polimorfizm

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

Technologie i usługi internetowe cz. 2

Obsługa wyjątków. Język C++ WW12

Dziedziczenie w klasach

Wstęp do Programowania 2

Programowanie i struktury danych

Programowanie obiektowe

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

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

Podstawy algorytmiki i programowania - wykład 4 C-struktury

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

Podstawy Programowania Obiektowego

tablica: dane_liczbowe

Transkrypt:

TEMAT : KLASY POLIMORFIZM 1. Wprowadzenie do polimorfizmu i funkcji wirtualnych w języku C++ Język C++ zakłada, że w pewnych przypadkach uzasadnione jest tworzenie klas, których reprezentanci w programie (obiekty) nie będą przedstawiały żadnego konkretnego obiektu fizycznego czy myślowego. Klasy takie nazywane są klasami abstrakcyjnymi. W odróżnieniu od klas abstrakcyjnych, pod pojęciem klas konkretnych rozumiemy takie klasy, których obiekty mogą reprezentować określony obiekt fizyczny lub myślowy. Klasy abstrakcyjne wygodnie jest wykorzystywać jako klasy podstawowe w przypadku programowania obiektowego opartego na dziedziczeniu. Zadaniem klas abstrakcyjnych jest dostarczenie pewnego interfejsu klasom pochodnym, które dziedziczą z klas abstrakcyjnych. Dana klasa staje się klasą abstrakcyjną, gdy przynajmniej jedna z jej funkcji składowych jest zadeklarowana jako tzw. czysta funkcja wirtualna (w deklaracji jest ona zainicjowana wartością zero). Co ważne, nie jest możliwe utworzenie obiektu klasy abstrakcyjnej. Czyste funkcje wirtualne powinny być zdefiniowane w klasach pochodnych. Polimorfizm (wielopostaciowość) jest mechanizmem języka C++, który umożliwia programiście na abstrakcyjne traktowanie określonych wyrażeń (niezależność od konkretnych typów). Zadanie Zaproponuj implementację w programie trzech klas: klasy abstrakcyjnej CFigura (będącej klasą podstawową), klas konkretnych CKolo i CKwadrat (będących klasami pochodnymi klasy CFigura). CFigura CKolo CKwadrat #pragma once Implementacja klasy CFigura jako abstrakcyjnej klasy podstawowej #include <iostream> #include <string> using namespace std; class CFigura public: CFigura(string nazwa_t = ""); ~CFigura(); void SetNazwa (string nazwa_t); string GetNazwa (); void Drukuj () const; virtual void Drukuj_FunkcjaWirtualna () const; virtual double Pole () const = 0; protected: string nazwa; ; CFigura::CFigura(string nazwa_t) SetNazwa(nazwa_t); CFigura::~CFigura() void CFigura::SetNazwa (string nazwa_t) nazwa = nazwa_t; 1

string CFigura::GetNazwa () return nazwa; void CFigura::Drukuj () const cout << "Nazwa = " << nazwa << endl; void CFigura::Drukuj_FunkcjaWirtualna () const cout << "Nazwa = " << nazwa << endl; Implementacja pochodnej klasy konkretnej CKolo (dziedziczącej z abstrakcyjnej klasy podstawowej CFigura) #pragma once #include "figura.h" class CKolo : public CFigura public: CKolo(double R_t = 1.0, string nazwa_t = ""); ~CKolo(); void SetDlugoscPromienia (double R_t); double GetDlugoscPromienia () const; virtual void Drukuj () const; virtual void Drukuj_FunkcjaWirtualna () const; virtual double Pole () const; private: double R; ; CKolo::CKolo(double R_t, string nazwa_t) : CFigura(nazwa_t) SetDlugoscPromienia (R_t); CKolo::~CKolo() void CKolo::SetDlugoscPromienia (double R_t) if (R_t > 0) R = R_t; else R = 1.0; double CKolo::GetDlugoscPromienia() const return R; double CKolo::Pole () const return 3.1415*R*R; void CKolo::Drukuj () const cout << "R = " << R << endl; 2

void CKolo::Drukuj_FunkcjaWirtualna () const cout << "R = " << R << endl; Implementacja pochodnej klasy konkretnej CKwadrat (dziedziczącej z abstrakcyjnej klasy podstawowej CFigura) #pragma once #include <string> #include "figura.h" using namespace std; class CKwadrat : public CFigura public: CKwadrat(double a_t = 1.0, string nazwa_t = ""); ~CKwadrat(); void SetDlugoscBoku (double a_t); double GetDlugoscBoku () const; virtual void Drukuj () const; virtual void Drukuj_FunkcjaWirtualna () const; virtual double Pole () const; private: double a; ; CKwadrat::CKwadrat(double a_t, string nazwa_t) : CFigura(nazwa_t) SetDlugoscBoku(a_t); CKwadrat::~CKwadrat() void CKwadrat::SetDlugoscBoku (double a_t) if (a_t > 0) a = a_t; else a = 1.0; double CKwadrat::GetDlugoscBoku () const return a; double CKwadrat::Pole () const return a*a; void CKwadrat::Drukuj () const cout << "a = " << a << endl; void CKwadrat::Drukuj_FunkcjaWirtualna () const cout << "a = " << a << endl; 3

Wykorzystanie klas CFigura, CKolo oraz CKwadrat w programie #include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; #include "Figura.h" #include "Kolo.h" #include "Kwadrat.h" // Przyklady wiazania dynamicznego w funkcjach 'DrukujPtr' i 'DrukujRef' void FunkcjaPtr (CFigura * fig) cout << "Wypisz informacje o figurze" << endl; cout << "Nazwa = " << fig->getnazwa() << ", pole = " << fig->pole() << endl; void FunkcjaRef (CFigura & fig) cout << "Wypisz informacje o figurze" << endl; cout << "Nazwa = " << fig.getnazwa() << ", pole = " << fig.pole() << endl; int _tmain(int argc, _TCHAR* argv[]) // Deklaracja obiektu CFigura nie jest mozliwa w programie, // gdyz nie mozemy deklarowac obiektow klasy abstrakcyjnej //CFigura moja_figura; //moja_figura.setnazwa("nieznana-figura"); // (1) CKolo kolo_bez_nazwy (2.5); CKolo kolo_nieznane; cout << "Figura 1-A:" << endl; cout << " Nazwa = " << kolo_bez_nazwy.getnazwa() << ", R = " << kolo_bez_nazwy.getdlugoscpromienia() << endl; cout << "Figura 1-B:" << endl; cout << " Nazwa = " << kolo_nieznane.getnazwa() << ", R = " << kolo_nieznane.getdlugoscpromienia() << endl; // (2) CKolo kolo(2.5,"moje-kolo"); cout << "Figura 2:" << endl; cout << " Nazwa = " << kolo.getnazwa() << ", R = " << kolo.getdlugoscpromienia() << ", Pole = " << kolo.pole() << endl; // (3) CKwadrat kwadrat(2.5,"moj-kwadrat"); cout << "Figura 3:" << endl; cout << " Nazwa = " << kwadrat.getnazwa() << ", a = " << kwadrat.getdlugoscboku() << ", Pole = " << kwadrat.pole() << endl; // Tablica obiektow typu CFigura CFigura * tab[4]; tab[0] = &kolo_bez_nazwy; tab[1] = &kolo_nieznane; tab[2] = &kolo; tab[3] = &kwadrat; 4

for (int i=0; i<=3; i++) cout << "Pole figury " << i+1 << " o nazwie " << tab[i]->getnazwa() << " = " << tab[i]->pole() << endl; // Przyklady wiazania dynamicznego w funkcjach 'DrukujPtr' i 'DrukujRef' FunkcjaPtr (&kolo); FunkcjaRef (kwadrat); //double dl_boku; //cout << "Podaj dlugosc boku a = "; cin >> dl_boku; //kwadrat.setdlugoscboku(dl_boku); // Wywolanie funkcji drukujacej dane w obiekcie CKolo KoloA(5.0,"KoloA"); CFigura * pfiguraa = &KoloA; CKwadrat KwadratB(6.0,"KwadratB"); CFigura & reffigurab = KwadratB; // Drukujemy obiekty KoloA i KwadratB wykorzystujac do tego funkcje // Drukuj_Wariant1 oraz Drukuj_Wariant2 cout << "" << endl; cout << "Drukujemy obiekt KoloA " << endl; cout << "wykorzystujac funkcje 'Drukuj' oraz 'Drukuj_FunkcjaWirtualna'" << endl; cout << "" << endl; cout << "KoloA poprzez obiekt klasy CKolo:" << endl; KoloA.Drukuj(); cout << "KoloA poprzez wskaznik do klasy CFigura i f. skladowa klasy:" << endl; pfiguraa->drukuj(); cout << "KoloA poprzez wskaznik do klasy CFigura i f. wirtualna:" << endl; pfiguraa->drukuj_funkcjawirtualna(); cout << "" << endl; cout << "Drukujemy obiekt KwadratB " << endl; cout << "wykorzystujac funkcje 'Drukuj' oraz 'Drukuj_FunkcjaWirtualna'" << endl; cout << "" << endl; cout << "KwadratB poprzez obiekt klasy CKwadrat:" << endl; KwadratB.Drukuj(); cout << "KwadratB poprzez referencje do zmien. typu CKwadrat i f. kladowa klasy:" << endl; reffigurab.drukuj(); cout << "KwadratB poprzez referencje do zmien. typu CKwadrat i f. wirtualna:" << endl; reffigurab.drukuj_funkcjawirtualna(); _getch(); return 0; Wydruk wyników działania programu Figura 1-A: Nazwa =, R = 2.5 Figura 1-B: Nazwa =, R = 1 5

Figura 2: Nazwa = Moje-kolo, R = 2.5, Pole = 19.6344 Figura 3: Nazwa = Moj-kwadrat, a = 2.5, Pole = 6.25 Pole figury 1 o nazwie = 19.6344 Pole figury 2 o nazwie = 3.1415 Pole figury 3 o nazwie Moje-kolo = 19.6344 Pole figury 4 o nazwie Moj-kwadrat = 6.25 Wypisz informacje o figurze Nazwa = Moje-kolo, pole = 19.6344 Wypisz informacje o figurze Nazwa = Moj-kwadrat, pole = 6.25 Drukujemy obiekt KoloA wykorzystujac funkcje 'Drukuj' oraz 'Drukuj_FunkcjaWirtualna' KoloA poprzez obiekt klasy CKolo: Nazwa = KoloA R = 5 KoloA poprzez wskaznik do klasy CFigura i f. skladowa klasy: Nazwa = KoloA KoloA poprzez wskaznik do klasy CFigura i f. wirtualna: Nazwa = KoloA R = 5 Drukujemy obiekt KwadratB wykorzystujac funkcje 'Drukuj' oraz 'Drukuj_FunkcjaWirtualna' KwadratB poprzez obiekt klasy CKwadrat: Nazwa = KwadratB a = 6 KwadratB poprzez referencje do zmien. typu CKwadrat i f. kladowa klasy: Nazwa = KwadratB KwadratB poprzez referencje do zmien. typu CKwadrat i f. wirtualna: Nazwa = KwadratB a = 6 Analiza istotnych elementów klas CFigura, CKolo oraz CKwadrat z punktu widzenia mechanizmu polimorfizmu 6