Dziedziczenie i poliformizm



Podobne dokumenty
Szablony funkcji i szablony klas

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

Konstruktor kopiujacy

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Rzutowanie i konwersje

Wyliczanie wyrażenia obiekty tymczasowe

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

Wprowadzenie do szablonów klas

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

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

Przestrzenie nazw. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Szablon klasy std::list

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

Schemat konstrukcja pliku Makefile

Qt sygnały i designer

Wartości domyślne, przeciażenia funkcji

Pola i metody statyczne

dr inż. Jarosław Forenc

Referencje do zmiennych i obiektów

Dziedziczenie jednobazowe, poliformizm

Wartości domyślne, przeciażenia funkcji

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

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

TEMAT : KLASY POLIMORFIZM

Lista dwukierunkowa - przykład implementacji destruktorów

Programowanie obiektowe w C++ Wykład 12

Operacje wejścia/wyjścia (odsłona druga) - pliki

Programowanie Obiektowe i C++

Klasa, metody, rozwijanie w linii

C++ - [4-7] Polimorfizm

TEMAT : KLASY DZIEDZICZENIE

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

Praca z aplikacją designer

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

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

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

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

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

Programowanie, część I

Klasa, metody, rozwijanie w linii

Programowanie obiektowe w języku

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

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

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

Dalmierze optyczne. Bogdan Kreczmer.

Czujniki PSD i dalmierze triangulacyjne

Obiekty i metody stałe

Materiały do zajęć VII

Zasoby, pliki graficzne

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Wykład 8: klasy cz. 4

Wprowadzenie do UML, przykład użycia kolizja

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

Przesłanianie nazw, przestrzenie nazw

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

Czujniki PSD i dalmierze triangulacyjne

Zaawansowane programowanie w C++ (PCP)

Abstrakcyjny typ danych

Dziedziczenie. Ogólna postać dziedziczenia klas:

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

Hermetyzacja oraz pola i metody statyczne

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Podstawy Programowania Obiektowego

Programowanie Obiektowe i C++

PARADYGMATY PROGRAMOWANIA Wykład 2

Programowanie obiektowe i zdarzeniowe

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

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

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Papyrus. Papyrus. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

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

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

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

Plik klasy. h deklaracje klas

Programowanie obiektowe

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

PARADYGMATY PROGRAMOWANIA Wykład 3

Programowanie, część I

Wprowadzenie do programowanie obiektowego w języku C++

Informatyka II Laboratorium 3 : Programowania obiektowe C++ - dziedziczenie

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

Język C++ Programowanie obiektowe

Podstawy Programowania Obiektowego

Weryfikatory, zasoby graficzne

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

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

Rozdział 4 KLASY, OBIEKTY, METODY

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

Style programowania - krótki przeglad

Programowanie Obiektowo Zorientowane w języku c++ Konstruktory

Diagramy UML, przykład problemu kolizji

Szablon klasy std::vector

Transkrypt:

Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Katedra Cybernetyki i Robotyki Wydziału Elektroniki Politechnika Wrocławska Kurs: Copyright c 2016 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu dotyczącego programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany wyłącznie w całości, razem z niniejszą stroną tytułową.

Niniejsza prezentacja została wykonana przy użyciu systemu składu L A TEX oraz stylu beamer, którego autorem jest Till Tantau. Strona domowa projektu Beamer: http://latex-beamer.sourceforge.net

Plan prezentacji 1 Rzutowanie Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody 2 Utrata informacji przy rzutowaniu w górę 3 Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Plan prezentacji Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody 1 Rzutowanie Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody 2 Utrata informacji przy rzutowaniu w górę 3 Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Rzutowanie wskaźnika Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany;

Rzutowanie wskaźnika Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany;

Rzutowanie wskaźnika Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany;

Rzutowanie wskaźnika Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; Gruszka wgr1 = new Gruszka();

Rzutowanie wskaźnika Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; Gruszka Owoc wgr1 = new Gruszka(); wowocx = wgr1;

Rzutowanie wskaźnika Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; Gruszka Owoc wgr1 = new Gruszka(); wowocx = wgr1; Rzutowanie na nadklasę (klasę bazową) może być wykonane niejawnie.

Rzutowanie wskaźnika Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; Gruszka Owoc wgr1 = new Gruszka(); wowocx = static cast<owoc >(wgr1); Można to również zrobić w sposób jawny.

Rzutowanie wskaźnika Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; Gruszka Owoc wgr1 = new Gruszka(); wowocx = wgr1; cout << Addr wgr: << wgr1 << endl; cout << Addr wow: << wowocx << endl;

Rzutowanie wskaźnika Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; Gruszka Owoc wgr1 = new Gruszka(); wowocx = wgr1; cout << Addr wgr: << wgr1 << endl; cout << Addr wow: << wowocx << endl; Wynik działania: Addr wgr: 0x804a008 Addr wow: 0x804a008 Brak różnicy w adresach wynika z tego, że obiekt klasy bazowej znajduje się na początku obiektu klasy pochodnej.

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor;

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor;

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor;

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy wdzwkol = new DzwigKolowy();

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy wdzwkol = new DzwigKolowy(); wpojazdk = wdzwkol;

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy wdzwkol = new DzwigKolowy(); wpojazdk = wdzwkol; Tak jak to miało miejsce wcześnij, rzutowanie na nadklasę (klasę bazową) może być wykonane niejawnie.

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy wdzwkol = new DzwigKolowy(); wpojazdk = static cast<pojazdkolowy >(wdzwkol); I tym przypadku można to również zrobić w sposób jawny.

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy wdzwkol = new DzwigKolowy(); wpojazdk = wdzwkol; cout << Addr wdzk: << wdzwkol << endl; cout << Addr wpoj: << wpojazdk << endl;

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy wdzwkol = new DzwigKolowy(); wpojazdk = wdzwkol; cout << Addr wdzk: << wdzwkol << endl; cout << Addr wpoj: << wpojazdk << endl; Wynik działania: Addr wdzk: 0x916c000 Addr wpoj: 0x906c004 W tym przykładzie rzutowanie wiąże się z fizyczną zmianą adresu. Różnica adresów związana jest z tym, że obiekt nadklasy PojazdKolowy jest drugi w kolejności w strukturze obiektu DzwigKolowy.

Rzutowanie na refencję Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; Gruszka Gr1;

Rzutowanie na refencję Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; Gruszka Owoc Gr1; &OwocX = Gr; Rzutowanie na referencję daje analogiczne efekty. Jest ono domyślnie realizowane niejawnie.

Rzutowanie na refencję Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; Gruszka Owoc Gr1; &OwocX = static cast<owoc&>(gr1); Zawsze można wykonać je jawnie wykorzystując operator rzutowania static cast.

Rzutowanie na refencję Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; Gruszka Owoc Gr1; &OwocX = Gr; cout << Addr Gr: << &Gr1 << endl; cout << Addr Ow: << &OwocX << endl; Wynik działania: Addr Gr: 0x7239c0a Addr Ow: 0x7239c0a Z tych samych przyczyn co poprzednio, oba wyświetlane adresy są takie same.

Rzutowanie na referencję Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy DzwKol;

Rzutowanie na referencję Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy DzwKol; &PojazdK = DzwKol; Tutaj również rzutowanie jest niejawne i przebiega ono analogicznie jak w tym samym przykładzie dla wskaźników.

Rzutowanie na referencję Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy DzwKol; &PojazdK = static cast<pojazdkolowy&>(dzwkol); Oczywiście można je zrealizować jawnie.

Rzutowanie na referencję Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy DzwKol; &PojazdK = DzwKol; cout << Addr DzK: << DzwKol << endl; cout << Addr Poj: << PojazdK << endl; Wynik działania: Addr wdzk: 0x7181d00 Addr wpoj: 0x7181d04 Z tych samym przyczyn, co w analogicznym przykładzie dla wskaźników, rzutowanie wiąże się z fizyczną zmianą adresu.

Rzutowanie w górę Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Rzutowanie w górę jest rzutowaniem na klasę bazową. Tego typu rzutowanie zawsze się powiedzie, gdyż obiekt klasy pochodnej musi zawierać podobiekt klasy bazowej. Z tego powodu rzutowanie to może być realizowane niejawnie.

Rzutowanie w górę Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Rzutowanie w górę jest rzutowaniem na klasę bazową. Tego typu rzutowanie zawsze się powiedzie, gdyż obiekt klasy pochodnej musi zawierać podobiekt klasy bazowej. Z tego powodu rzutowanie to może być realizowane niejawnie.

Plan prezentacji Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody 1 Rzutowanie Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody 2 Utrata informacji przy rzutowaniu w górę 3 Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Rzutowanie na wskaźnik do nadobiektu Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy DzwKol;

Rzutowanie na wskaźnik do nadobiektu Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy DzwKol; wpojazdk = &DzwKol; Rzutowanie w górę przebiega w sposób niejawny. Tu jest OK.

Rzutowanie na wskaźnik do nadobiektu Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy DzwigKolowy DzwKol; wpojazdk = &DzwKol; wdzwigko = wpojazdk; A co z tym przypadkiem?

Rzutowanie na wskaźnik do nadobiektu Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy DzwigKolowy DzwKol; wpojazdk = &DzwKol; wdzwigko = wpojazdk; Ten typ rzutowania nie może być niejawny.

Rzutowanie na wskaźnik do nadobiektu Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy DzwigKolowy DzwKol; wpojazdk = &DzwKol; wdzwigko = static cast<dzwigkolowy >(wpojazdk); Można jednak wymusić rzutowanie w sposób jawny wykorzystując operator rzutowania static cast.

Rzutowanie na wskaźnik do nadobiektu Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy DzwigKolowy DzwKol; wpojazdk = &DzwKol; wdzwigko = static cast<dzwigkolowy >(wpojazdk); cout << Addr DzK1: << &DzwKol << endl; cout << Addr DzK2: << wdzwigko << endl; Wynik działania: Addr wdzk1: 0x7918c08 Addr wdzk2: 0x7918c08 Dzięki tej operacji dysponując częścią obiektu możemy odzyskać adres całego obiektu.

Rzutowanie na referencję do nadobiektu Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy DzwKol; &PojazdK = DzwKol;

Rzutowanie na referencję do nadobiektu Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy DzwigKolowy DzwKol; &PojazdK = DzwKol; &DzwigKo = static cast<dzwigkolowy&>(pojazdk); Możemy wymusić rzutowanie w górę na referencję do obiektu

Rzutowanie na referencję do nadobiektu Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; DzwigKolowy PojazdKolowy DzwigKolowy DzwKol; &PojazdK = DzwKol; &DzwigKo = static cast<dzwigkolowy&>(pojazdk); cout << Addr DzK1: << &DzwKol << endl; cout << Addr DzK2: << wdzwigko << endl; Wynik działania: Addr wdzk1: 0x7918c08 Addr wdzk2: 0x7918c08 Dzięki tej operacji dysponując częścią obiektu możemy odzyskać adres całego obiektu.

Rzutowanie w dół Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Rzutowanie w dół jest rzutowaniem na klasę pochodną. Ze względu na to, że obiekt klasy bazowej nie zawsze musi być składnikiem obiektu klasy pochodnej (np. może występować samodzielnie), rzutowanie to może nie powieść się.

Rzutowanie w dół Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Rzutowanie w dół jest rzutowaniem na klasę pochodną. Ze względu na to, że obiekt klasy bazowej nie zawsze musi być składnikiem obiektu klasy pochodnej (np. może występować samodzielnie), rzutowanie to może nie powieść się.

Błędne rzutowanie w górę Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; PojazdKolowy PojK; Ten typ rzutowania może być niebezpieczny. Rozważmy następującą sytuację...

Błędne rzutowanie w górę Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; PojazdKolowy DzwigKolowy PojK; wdzwigk = static cast<dzwigkolowy >(&PojK); Rzutując otrzymujemy wskaźnik na nieistniejący obiekt. Odwołując się do niego prawie na pewno w którymś momencie zobaczymy komunikat segmentation fault :(

Błędne rzutowanie w górę Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody struct Dzwig double MaksUdzwig; ; //.......................................... struct PojazdKolowy unsigned int IloscKol; ; //................................. struct DzwigKolowy: public Dzwig, public PojazdKolowy, //......................... unsigned int IloscPodpor; PojazdKolowy DzwigKolowy PojK; wdzwigk = static cast<dzwigkolowy >(&PojK); cout << Addr PojK: << &PojK << endl; cout << Addr DzwK: << wdzwigk << endl; Wynik działania: Addr PojK: 0x6198e04 Addr DzwK: 0x6198e00 Adres dostępny poprzez wdzwigk, nie jest adresem rzeczywistego obiektu.

Plan prezentacji Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody 1 Rzutowanie Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody 2 Utrata informacji przy rzutowaniu w górę 3 Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Niejawne rzutowanie w liście parametrów funkcji struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; void Wyswietl(const Owoc wowoc) cout << Waga: << wowoc > Waga kg << endl; Gruszka Gr1;

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Niejawne rzutowanie w liście parametrów funkcji struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; void Wyswietl(const Owoc wowoc) cout << Waga: << wowoc > Waga kg << endl; Gruszka Gr1;

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Niejawne rzutowanie w liście parametrów funkcji struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; void Wyswietl(const Owoc wowoc) cout << Waga: << wowoc > Waga kg << endl; Gruszka Gr1; Wyswietl(&Gr1); Niejawne rzutowanie pozwala wykorzystać funkcjonalności stworzone dla klasy bazowej na potrzeby obiektów klasy pochodnej.

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Niejawne rzutowanie w liście parametrów funkcji struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; inline void Wyswietl(const Owoc wowoc) cout << Waga: << wowoc > Waga kg << endl; Gruszka Gr1; const Owoc wowoc = &Gr1; cout << Waga: << wowoc > Waga kg << endl; Niejawne rzutowanie w liście parametrów jest niczym innym jak rzutowaniem w przypadku operacji podstawienia.

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Rzutowanie na referencję w liście parametrów struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; void Wyswietl(const Owoc &Ow) cout << Waga: << Ow. Waga kg << endl; Gruszka Gr1;

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Rzutowanie na referencję w liście parametrów struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; void Wyswietl(const Owoc &Ow) cout << Waga: << Ow. Waga kg << endl; Gruszka Gr1;

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Rzutowanie na referencję w liście parametrów struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; void Wyswietl(const Owoc &Ow) cout << Waga: << Ow. Waga kg << endl; Gruszka Gr1; Wyswietl(Gr1); Możliwość niejawnego rzutowania na referencje do obiektów klasy bazowej, jeszcze bardziej rozszerza użyteczność funkcji tworzonych dla tych obiektów.

Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Niejawne rzutowanie na referencję w liście parametrów struct Owoc //...................................................................... double Waga kg; struct Gruszka: public Owoc //...................................................... int KodOdmiany; inline void Wyswietl(const Owoc &Ow) cout << Waga: << Ow. Waga kg << endl; Gruszka Gr1; const Owoc &Ow = Gr1; cout << Waga: << Ow. Waga kg << endl; Niejawne rzutowanie w liście parametrów jest niczym innym jak rzutowaniem w przypadku operacji podstawienia.

Jak rozumieć polimorfizm Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody Polimorfizm (gr. wielopostaciowość) w przypadku podejścia obiektowo zorientowanego przez pojęcie polimorfizmu rozumie się możliwość stworzenia obiektu, który może mieć więcej niż jedną formę. W praktyce oznacza to, że może on mieć metodę, która dla tego samego typu obiektów mają różne definicje.

Plan prezentacji Utrata informacji przy rzutowaniu w górę 1 Rzutowanie Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody 2 Utrata informacji przy rzutowaniu w górę 3 Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Utrata informacji przy rzutowaniu w górę Wykorzystywanie funkcjonalności klasy bazowej struct KlasaBazowa //.............................................................. int Wartosc() const return 1; struct KlasaPochodna: public KlasaBazowa //....................................... int Wartosc() const return 9; KlasaPochodna ObP; KlasaBazowa wskb = &ObP; cout << ObP.Wartosc() << endl; cout << ObP.KlasaBazowa::Wartosc() << endl; cout << wskb->wartosc() << endl;...

Utrata informacji przy rzutowaniu w górę Wykorzystywanie funkcjonalności klasy bazowej struct FiguraGeometryczna //........................................................ float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float a; float Pole( ) const return a a; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. a = 2; WyswietlPole( Kw );

Utrata informacji przy rzutowaniu w górę Wykorzystywanie funkcjonalności klasy bazowej struct FiguraGeometryczna //........................................................ float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float a; float Pole( ) const return a a; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. a = 2; WyswietlPole( Kw );

Utrata informacji przy rzutowaniu w górę Wykorzystywanie funkcjonalności klasy bazowej struct FiguraGeometryczna //........................................................ float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float a; float Pole( ) const return a a; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. a = 2; WyswietlPole( Kw );

Utrata informacji przy rzutowaniu w górę Wykorzystywanie funkcjonalności klasy bazowej struct FiguraGeometryczna //........................................................ float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float a; float Pole( ) const return a a; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. a = 2; WyswietlPole( Kw ); Wynik działania: Pole: 0

Utrata informacji przy rzutowaniu w górę Wykorzystywanie funkcjonalności klasy bazowej struct FiguraGeometryczna //........................................................ float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float a; float Pole( ) const return a a; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. a = 2; WyswietlPole( Kw ); Dysponując klasą pochodną możemy skorzystać z funkcji stworzonych dla klasy bazowej. Operują one jednak tylko i wyłącznie na podobiektach klasy bazowej. Wynik działania: Pole: 0

Utrata informacji przy rzutowaniu w górę Wykorzystywanie funkcjonalności klasy bazowej void WyswietlPole( const FiguraGeometryczna & Fig ) float Pole; switch (??? ) case? : Pole = Fig.Pole( ); break ; case? : Pole = static cast <Kwadrat&>(Fig).Pole( ); break ; cout << Pole: << Pole << endl;

Utrata informacji przy rzutowaniu w górę Wykorzystywanie funkcjonalności klasy bazowej void WyswietlPole( const FiguraGeometryczna & Fig ) float Pole; switch (??? ) case? : Pole = Fig.Pole( ); break ; case? : Pole = static cast <Kwadrat&>(Fig).Pole( ); break ; cout << Pole: << Pole << endl;

Utrata informacji przy rzutowaniu w górę Wykorzystywanie funkcjonalności klasy bazowej void WyswietlPole( const FiguraGeometryczna & Fig ) float Pole; switch (??? ) case? : Pole = Fig.Pole( ); break ; case? : Pole = static cast <Kwadrat&>(Fig).Pole( ); break ; cout << Pole: << Pole << endl; Jeżeli w jakiś sposób odzyskamy informację o nadtypie obiektu, to możemy odpowiednio zmodyfikować funkcję, tak aby można było ją również stosować dla obiektów klasy pochodnej.

Utrata informacji przy rzutowaniu w górę Rozpoznawanie typu poprzez identyfikator struct FiguraGeometryczna //........................................................ FiguraGeometryczna( ): TypID( ) int ID( ) const return TypID; float Pole( ) const return 0; protected : int TypID; FiguraGeometryczna( int ID ): TypID( ID ) struct Kwadrat: public FiguraGeometryczna //....................................... float a; Kwadrat( ): FiguraGeometryczna( 1 ) float Pole( ) const return a a;

Utrata informacji przy rzutowaniu w górę Rozpoznawanie typu poprzez identyfikator struct FiguraGeometryczna //........................................................ FiguraGeometryczna( ): TypID( ) int ID( ) const return TypID; float Pole( ) const return 0; protected : int TypID; FiguraGeometryczna( int ID ): TypID( ID ) Aby móc rozpoznać typ nadobiektu struct Kwadrat: public FiguraGeometryczna //......... można....... wprowadzić............ dodatkowe........... pole. float a; Kwadrat( ): FiguraGeometryczna( 1 ) float Pole( ) const return a a;

Utrata informacji przy rzutowaniu w górę Rozpoznawanie typu poprzez identyfikator struct FiguraGeometryczna //........................................................ FiguraGeometryczna( ): TypID( ) int ID( ) const return TypID; float Pole( ) const return 0; protected : int TypID; FiguraGeometryczna( int ID ): TypID( ID ) Aby móc rozpoznać typ nadobiektu struct Kwadrat: public FiguraGeometryczna //......... można....... wprowadzić............ dodatkowe........... pole. float a; Musi ono zawierać wartość sta- nowiącą identyfikator danej klasy lub nadklasy. Identyfikator ten po- Kwadrat( ): FiguraGeometryczna( 1 ) float Pole( ) const return a a; winien być przypisany polu w mo- mencie tworzenia obiektu, tzn. w konstruktorze.

Wykorzystanie identyfikatora typu Utrata informacji przy rzutowaniu w górę void WyswietlPole( const FiguraGeometryczna & Fig ) float Pole; switch ( Fig.ID( ) ) case 0 : Pole = Fig.Pole( ); break ; case 1 : Pole = static cast <Kwadrat&>(Fig).Pole( ); break ; cout << Pole: << Pole << endl;

Wykorzystanie identyfikatora typu Utrata informacji przy rzutowaniu w górę void WyswietlPole( const FiguraGeometryczna & Fig ) float Pole; switch ( Fig.ID( ) ) case 0 : Pole = Fig.Pole( ); break ; case 1 : Pole = static cast <Kwadrat&>(Fig).Pole( ); break ; cout << Pole: << Pole << endl;

Wykorzystanie identyfikatora typu Utrata informacji przy rzutowaniu w górę void WyswietlPole( const FiguraGeometryczna & Fig ) float Pole; switch ( Fig.ID( ) ) case 0 : Pole = Fig.Pole( ); break ; case 1 : Pole = static cast <Kwadrat&>(Fig).Pole( ); break ; cout << Pole: << Pole << endl; Wprowadzone pole identyfikatora pozwala rozpoznać klasę, której częścią jest dany obiekt.

Wykorzystanie identyfikatora typu Utrata informacji przy rzutowaniu w górę void WyswietlPole( const FiguraGeometryczna & Fig ) float Pole; switch ( Fig.ID( ) ) case 0 : Pole = Fig.Pole( ); break ; case 1 : Pole = static cast <Kwadrat&>(Fig).Pole( ); break ; cout << Pole: << Pole << endl; Wprowadzone pole identyfikatora pozwala rozpoznać klasę, której częścią jest dany obiekt.

Plan prezentacji Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów 1 Rzutowanie Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody 2 Utrata informacji przy rzutowaniu w górę 3 Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie metod wirtualnych w klasie struct FiguraGeometryczna //........................................................ float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; float Pole( ) const return DlugoscBoku DlugoscBoku; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. DlugoscBoku = 2; WyswietlPole( Kw );

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie metod wirtualnych w klasie struct FiguraGeometryczna //........................................................ virtual float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; virtual float Pole( ) const return DlugoscBoku DlugoscBoku; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. DlugoscBoku = 2; WyswietlPole( Kw );

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie metod wirtualnych w klasie struct FiguraGeometryczna //........................................................ virtual float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; virtual float Pole( ) const return DlugoscBoku DlugoscBoku; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. DlugoscBoku = 2; WyswietlPole( Kw );

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie metod wirtualnych w klasie struct FiguraGeometryczna //........................................................ virtual float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; virtual float Pole( ) const return DlugoscBoku DlugoscBoku; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. DlugoscBoku = 2; WyswietlPole( Kw );

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie metod wirtualnych w klasie struct FiguraGeometryczna //........................................................ virtual float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; virtual float Pole( ) const return DlugoscBoku DlugoscBoku; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. DlugoscBoku = 2; WyswietlPole( Kw ); Wynik działania: Pole: 4

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie metod wirtualnych w klasie struct FiguraGeometryczna //........................................................ virtual float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; virtual float Pole( ) const return DlugoscBoku DlugoscBoku; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. DlugoscBoku = 2; WyswietlPole( Kw ); Wynik działania: Pole: 4 Wprowadzenie metody wirtualnej sprawia, że podobiekt wie, że jest składnikiem większej całości.

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Występowanie słowa kluczowego virtual struct FiguraGeometryczna //........................................................ virtual float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; virtual float Pole( ) const return DlugoscBoku DlugoscBoku; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. DlugoscBoku = 2; WyswietlPole( Kw ); Wynik działania: Pole: 4

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Występowanie słowa kluczowego virtual struct FiguraGeometryczna //........................................................ virtual float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; float Pole( ) const return DlugoscBoku DlugoscBoku; void WyswietlPole( const FiguraGeometryczna & Fig ) cout << Pole: << Fig.Pole( ) << endl; Kwadrat Kw; Kw. DlugoscBoku = 2; WyswietlPole( Kw ); Wynik działania: Pole: 4

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Występowanie słowa kluczowego virtual struct FiguraGeometryczna //........................................................ virtual float Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; float Pole( ) const return DlugoscBoku DlugoscBoku; W klasie pochodnej nie jest konieczne używanie void WyswietlPole( const FiguraGeometryczna & Fig ) modyfikatora virtual do zdefiniowania metody wirtualnej. cout << Pole: << Fig.Pole( ) << endl; Wystarczy, że metoda ta z modyfikatorem virtual została zdefiniowana w klasie bazowej. Każda następna definicja w Kwadrat Kw; klasach pochodnych Kw. DlugoscBoku = 2; Wynik działania: automatycznie uznawana jest WyswietlPole( Kw ); jako definicja metody wirtualnej. Pole: 4

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definicja metody poza ciałem definicji klasy struct FiguraGeometryczna //........................................................ virtual float Pole( ) const; float FiguraGeometryczna::Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; virtual float Pole( ) const; float Kwadrat::Pole( ) const return DlugoscBoku DlugoscBoku;

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definicja metody poza ciałem definicji klasy struct FiguraGeometryczna //........................................................ virtual float Pole( ) const; float FiguraGeometryczna::Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; virtual float Pole( ) const; float Kwadrat::Pole( ) const return DlugoscBoku DlugoscBoku;

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definicja metody poza ciałem definicji klasy struct FiguraGeometryczna //........................................................ virtual float Pole( ) const; float FiguraGeometryczna::Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; virtual float Pole( ) const; float Kwadrat::Pole( ) const return DlugoscBoku DlugoscBoku;

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definicja metody poza ciałem definicji klasy struct FiguraGeometryczna //........................................................ virtual float Pole( ) const; float FiguraGeometryczna::Pole( ) const return 0; struct Kwadrat: public FiguraGeometryczna //....................................... float DlugoscBoku; virtual float Pole( ) const; definiowane ; //.................................................... poza..... ciałem....... definicji........ klasy.......... definiowane są tak samo jak float Kwadrat::Pole( ) const zwykłe metody. Modyfikator virtual występuje return DlugoscBoku DlugoscBoku; tylko i wyłącznie w definicji klasy.

Plan prezentacji Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów 1 Rzutowanie Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody 2 Utrata informacji przy rzutowaniu w górę 3 Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Destruktory Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów struct FiguraGeometryczna //........................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl; struct Kwadrat: FiguraGeometryczna //................................................. Kwadrat( ) cout << Konstruktor: Kwadrat << endl; Kwadrat( ) cout << Destruktor: Kwadrat << endl; FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig;

Destruktory Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów struct FiguraGeometryczna //........................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl; struct Kwadrat: FiguraGeometryczna //................................................. Kwadrat( ) cout << Konstruktor: Kwadrat << endl; Kwadrat( ) cout << Destruktor: Kwadrat << endl; FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig;

Destruktory Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów struct FiguraGeometryczna //........................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl; struct Kwadrat: FiguraGeometryczna //................................................. Kwadrat( ) cout << Konstruktor: Kwadrat << endl; Kwadrat( ) cout << Destruktor: Kwadrat << endl; FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig;

Destruktory Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów struct FiguraGeometryczna //........................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl; struct Kwadrat: FiguraGeometryczna //................................................. Kwadrat( ) cout << Konstruktor: Kwadrat << endl; Kwadrat( ) cout << Destruktor: Kwadrat << endl; FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig;

Destruktory Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów struct FiguraGeometryczna //........................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl; struct Kwadrat: FiguraGeometryczna //................................................. Kwadrat( ) cout << Konstruktor: Kwadrat << endl; Kwadrat( ) cout << Destruktor: Kwadrat << endl; FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig; Wynik działania: Konstruktor: FiguraGeometryczna Konstruktor: Kwadrat Destruktor: FiguraGeometryczna

Destruktory Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów struct FiguraGeometryczna //........................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl; struct Kwadrat: FiguraGeometryczna //................................................. Kwadrat( ) cout << Konstruktor: Kwadrat << endl; Kwadrat( ) cout << Destruktor: Kwadrat << endl; FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig; Wynik działania: Konstruktor: FiguraGeometryczna Konstruktor: Kwadrat Destruktor: FiguraGeometryczna

Destruktory Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów struct FiguraGeometryczna //........................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl; struct Kwadrat: FiguraGeometryczna //................................................. Kwadrat( ) cout << Konstruktor: Kwadrat << endl; Kwadrat( ) cout << Destruktor: Kwadrat << endl; FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig; Wynik działania: Konstruktor: FiguraGeometryczna Konstruktor: Kwadrat Destruktor: FiguraGeometryczna

Destruktory Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów struct FiguraGeometryczna //........................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl; struct Kwadrat: FiguraGeometryczna //................................................. Kwadrat( ) cout << Konstruktor: Kwadrat << endl; Kwadrat( ) cout << Destruktor: Kwadrat << endl; FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig; Wynik działania: Konstruktor: FiguraGeometryczna Konstruktor: Kwadrat Destruktor: FiguraGeometryczna Jeżeli w klasie bazowej zdefiniowany jest zwykły destruktor, to operacja destrukcji dokonywana za pośrednictwem wskaźnika na podobiekt inicjalizowana jest tylko dla klasy bazowej. Własność ta nie zależy od tego czy klasa bazowa ma metody wirtualne, czy też nie.

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie destruktorów wirtualnych struct FiguraGeometryczna //............................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; virtual FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl;..... struct Kwadrat: FiguraGeometryczna //..................................................... Kwadrat( ) cout << Konstruktor: Kwadrat << endl; virtual Kwadrat( ) cout << Destruktor: Kwadrat << endl;..... FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig;

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie destruktorów wirtualnych struct FiguraGeometryczna //............................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; virtual FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl;..... struct Kwadrat: FiguraGeometryczna //..................................................... Kwadrat( ) cout << Konstruktor: Kwadrat << endl; virtual Kwadrat( ) cout << Destruktor: Kwadrat << endl;..... FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig;

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie destruktorów wirtualnych struct FiguraGeometryczna //............................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; virtual FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl;..... struct Kwadrat: FiguraGeometryczna //..................................................... Kwadrat( ) cout << Konstruktor: Kwadrat << endl; virtual Kwadrat( ) cout << Destruktor: Kwadrat << endl;..... FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig;

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie destruktorów wirtualnych struct FiguraGeometryczna //............................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; virtual FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl;..... struct Kwadrat: FiguraGeometryczna //..................................................... Kwadrat( ) cout << Konstruktor: Kwadrat << endl; virtual Kwadrat( ) cout << Destruktor: Kwadrat << endl;..... FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig;

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie destruktorów wirtualnych struct FiguraGeometryczna //............................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; virtual FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl;..... struct Kwadrat: FiguraGeometryczna //..................................................... Kwadrat( ) cout << Konstruktor: Kwadrat << endl; virtual Kwadrat( ) cout << Destruktor: Kwadrat << endl;..... FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig; Wynik działania: Konstruktor: FiguraGeometryczna Konstruktor: Kwadrat Destruktor: Kwadrat Destruktor: FiguraGeometryczna

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie destruktorów wirtualnych struct FiguraGeometryczna //............................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; virtual FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl;..... struct Kwadrat: FiguraGeometryczna //..................................................... Kwadrat( ) cout << Konstruktor: Kwadrat << endl; virtual Kwadrat( ) cout << Destruktor: Kwadrat << endl;..... FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig; Wynik działania: Konstruktor: FiguraGeometryczna Konstruktor: Kwadrat Destruktor: Kwadrat Destruktor: FiguraGeometryczna

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie destruktorów wirtualnych struct FiguraGeometryczna //............................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; virtual FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl;..... struct Kwadrat: FiguraGeometryczna //..................................................... Kwadrat( ) cout << Konstruktor: Kwadrat << endl; virtual Kwadrat( ) cout << Destruktor: Kwadrat << endl;..... FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig; Wynik działania: Konstruktor: FiguraGeometryczna Konstruktor: Kwadrat Destruktor: Kwadrat Destruktor: FiguraGeometryczna

Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Definiowanie destruktorów wirtualnych struct FiguraGeometryczna //............................................................ FiguraGeometryczna( ) cout << Konstruktor: FiguraGeometryczna << endl; virtual FiguraGeometryczna( ) cout << Destruktor: FiguraGeometryczna << endl;..... struct Kwadrat: FiguraGeometryczna //..................................................... Kwadrat( ) cout << Konstruktor: Kwadrat << endl; virtual Kwadrat( ) cout << Destruktor: Kwadrat << endl;..... FiguraGeometryczna wobfig = new Kwadrat( ); delete wobfig; Wynik działania: Konstruktor: FiguraGeometryczna Konstruktor: Kwadrat Destruktor: Kwadrat Destruktor: FiguraGeometryczna Wprowadzenie destruktora wirtualnego umożliwia właściwą destrukcję obiektu. Obiekt w momencie destrukcji wie, że jest częścią większej całości.

Podsumowanie Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Polimorfizm (wielopostaciowość) jest jedną z ważniejszych cech programowania obiektowego. Wraz z dziedziczeniem jest on podstawowym mechanizmem wykorzystywanym przy tworzeniu bibliotek obiektowo zorientowanych. Polimorfizm wraz z możliwością niejawnego rzutowaniem w górę pozwala tworzyć uniwersalne narzędzia dla wszystkich obiektów należących do klas dziedziczących daną klasę bazową. Destruktory wirtualne wspierają operacje na obiektach tworzonych dynamicznie. Dzięki niejawnemu rzutowaniu w górę w narzędziach stworzonych dla klasy bazowej, obiekty te można bezpiecznie poddawać destrukcji. udostępniają wygodny mechanizm tworzenia własnego systemu identyfikacji typu w trakcie działania programu.

Podsumowanie Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Polimorfizm (wielopostaciowość) jest jedną z ważniejszych cech programowania obiektowego. Wraz z dziedziczeniem jest on podstawowym mechanizmem wykorzystywanym przy tworzeniu bibliotek obiektowo zorientowanych. Polimorfizm wraz z możliwością niejawnego rzutowaniem w górę pozwala tworzyć uniwersalne narzędzia dla wszystkich obiektów należących do klas dziedziczących daną klasę bazową. Destruktory wirtualne wspierają operacje na obiektach tworzonych dynamicznie. Dzięki niejawnemu rzutowaniu w górę w narzędziach stworzonych dla klasy bazowej, obiekty te można bezpiecznie poddawać destrukcji. udostępniają wygodny mechanizm tworzenia własnego systemu identyfikacji typu w trakcie działania programu.

Podsumowanie Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Polimorfizm (wielopostaciowość) jest jedną z ważniejszych cech programowania obiektowego. Wraz z dziedziczeniem jest on podstawowym mechanizmem wykorzystywanym przy tworzeniu bibliotek obiektowo zorientowanych. Polimorfizm wraz z możliwością niejawnego rzutowaniem w górę pozwala tworzyć uniwersalne narzędzia dla wszystkich obiektów należących do klas dziedziczących daną klasę bazową. Destruktory wirtualne wspierają operacje na obiektach tworzonych dynamicznie. Dzięki niejawnemu rzutowaniu w górę w narzędziach stworzonych dla klasy bazowej, obiekty te można bezpiecznie poddawać destrukcji. udostępniają wygodny mechanizm tworzenia własnego systemu identyfikacji typu w trakcie działania programu.

Podsumowanie Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Polimorfizm (wielopostaciowość) jest jedną z ważniejszych cech programowania obiektowego. Wraz z dziedziczeniem jest on podstawowym mechanizmem wykorzystywanym przy tworzeniu bibliotek obiektowo zorientowanych. Polimorfizm wraz z możliwością niejawnego rzutowaniem w górę pozwala tworzyć uniwersalne narzędzia dla wszystkich obiektów należących do klas dziedziczących daną klasę bazową. Destruktory wirtualne wspierają operacje na obiektach tworzonych dynamicznie. Dzięki niejawnemu rzutowaniu w górę w narzędziach stworzonych dla klasy bazowej, obiekty te można bezpiecznie poddawać destrukcji. udostępniają wygodny mechanizm tworzenia własnego systemu identyfikacji typu w trakcie działania programu.

Plan prezentacji Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów 1 Rzutowanie Rzutowanie w górę Rzutowaie w dół Rzutowanie w liście parametrów wywołania funkcji/metody 2 Utrata informacji przy rzutowaniu w górę 3 Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Sformułowanie problemu Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów Należy stworzyć jedną listę obiektów reprezentujących różne figury geometryczne.

Diagram klas Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Diagram klas Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Diagram klas Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Diagram klas Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Diagram klas Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Diagram klas Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Diagram klas Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Diagram klas Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Diagram klas Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Diagram klas Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Diagram klas Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów

Definicje klas figur geometrycznych Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów struct FiguraGeometryczna //........................................................... virtual const char NazwaFigury( ) const return Figura ; virtual FiguraGeometryczna( )....

Definicje klas figur geometrycznych Definiowanie metod wirtualnych Destruktory wirtualne Lista obiektów różnych typów struct FiguraGeometryczna //........................................................... virtual const char NazwaFigury( ) const return Figura ; virtual FiguraGeometryczna( )....