Wprowadzenie do programowanie obiektowego w języku C++



Podobne dokumenty
Wprowadzenie do programowanie obiektowego w języku C++

Mechanizm dziedziczenia

Programowanie obiektowe w języku C++

Programowanie w języku C++

Mechanizm dziedziczenia

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.

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

TEMAT : KLASY DZIEDZICZENIE

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

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

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

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

Wstęp do Programowania 2

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

Dziedziczenie. Ogólna postać dziedziczenia klas:

Wykład 8: klasy cz. 4

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

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

Programowanie obiektowe w języku

Podstawy Programowania Obiektowego

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

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

Podstawy programowania w języku C++

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

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

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

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

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

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

Materiały do zajęć VII

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

Dziedziczenie. dr Jarosław Skaruz

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

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

dr inż. Jarosław Forenc

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

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

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

Technologie i usługi internetowe cz. 2

Programowanie obiektowe - 1.

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

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

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

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

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

PARADYGMATY PROGRAMOWANIA Wykład 2

Programowanie obiektowe

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

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

Wprowadzenie do obiektowości

Programowanie obiektowe

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.

Pola i metody statyczne

Programowanie Obiektowe i C++ Marcin Benke

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

Do czego służą klasy?

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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

Wprowadzenie do programowanie obiektowego w języku C++

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Podstawy Programowania Obiektowego

Wykład 5: Klasy cz. 3

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

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

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Laboratorium 1 - Programowanie proceduralne i obiektowe

Podstawy programowania w języku C++

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

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

Podstawy programowania w języku C++

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

Kompozycja i dziedziczenie klas

Podstawy programowania w języku C++

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

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

Zaawansowane programowanie w C++ (PCP)

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

Programowanie Obiektowe i C++

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

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

1 Dziedziczenie. 1.1 Koncepcja dziedziczenia. Ćwiczenie 3

Język programowania. Andrzej Bobyk

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Wstęp do programowania obiektowego. Wykład 2

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

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Podstawy programowania w języku C++

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

Projektowanie obiektowe. Roman Simiński Polimorfizm

Technologie cyfrowe semestr letni 2018/2019

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Programowanie obiektowe język C++

Programowanie w języku C++

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

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

tel Konsultacje www

Transkrypt:

Wprowadzenie do programowanie obiektowego w języku C++ Część trzecia Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa. Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne. Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione.

Co było przyczyną powstania koncepcji dzedziczenia? Ponowne wykorzystanie elementów oprogramowania W trakcie projektowania i realizacji systemów informatycznych wielokrotnie powtarzają się jednakowe lub podobne elementy oprogramowania. Powtarzalność taką można obserwować zarówno etapie analizy, projektowania i programowania. Na etapie analizy są to zwykle obiekty dziedziny problemu, na etapie projektowania i programowania zarówno obiekty dziedziny problemu jak i obiekty implementacyjne. Ponowne wykorzystanie (ang. reuse) pozwala: na zwiększenie wydajności procesu programowania, poprawia jakość i niezawodność kodu, ułatwia rozwój i pielęgnację oprogramowania. Copyright Roman Simiński Strona : 2

Co było przyczyną powstania koncepcji dzedziczenia? Ponowne wykorzystanie kodu w programowaniu obiektowym Podejście obiektowe eksponuje rolę obiektu jest on abstrakcją pewnego konkretnego bytu ze świata rzeczywistego, reprezentujący rzecz (obiekt fizyczny) lub pojęcie (obiekt konceptualny). W programowaniu obiektowym ponowne wykorzystanie kodu polega na wykorzystaniu obiektów tej samej, raz zdefiniowanej klasy w różnych projektach. Klasa: Auto Cechy Akcje Marka Model Rok produkcji Nr rejestracyjny Kolor nadwozia Nr silnika Podaj średnie spalanie Podaj przebieg Copyright Roman Simiński Strona : 3

Co było przyczyną powstania koncepcji dzedziczenia? Niestety W obrębie obiektów dziedziny problemu powtarzają się obiekty podobne lecz bardzo rzadko identyczne. Autosalon Auto Autokomis Auto Serwis Auto Stacja diagnostyczna Auto Podobne lecz nieidentyczne Finanse-Księgowość Faktura Sprzedaż Faktura Windykacja Faktura Biuro rachunkowe Faktura Copyright Roman Simiński Strona : 4

Co było przyczyną powstania koncepcji dzedziczenia? Niestety W obrębie obiektów implementacyjnych powtarzalność obiektów identycznych jest znacznie częstsza, co jednak nie jest regułą. Okno aplikacji Okno dialogowe Belka narzedziowa Przyciski Copyright Roman Simiński Strona : 5

Co było przyczyną powstania koncepcji dzedziczenia? Ponowne wykorzystanie kodu problemy Powtarzalność nieidentycznych obiektów powoduje to, że musimy modyfikować istniejący kod, dostosowując go do specyfiki projektu. Modyfikacje potrzebne z punktu widzenia jednego systemu mogą być nieużyteczne lub nieakceptowalne z punktu widzenia innego systemu. Modyfikacje dostosowujące kod do specyfiki systemu zmuszają do utrzymywania różnych wersji tego samego kodu. Modyfikacje Autokomis Auto Autosalon Auto Modyfikacje Stacja diagnostyczna Auto Modyfikacje Serwis Auto Konieczność wprowadzenia w kodzie zmian o charakterze podstawowym, może spowodować konieczność zmodyfikowania wielu różnych jego wersji. Jest to uciążliwe, nieproduktywne i może być przyczyną błędów. Copyright Roman Simiński Strona : 6

Koncepcja dziedziczenia Ponowne wykorzystanie kodu z wykorzystaniem dziedziczenia marka model rokprod nrrej AutoWKomisie Auto cena dataprzyjecia wlasciciel polega na budowaniu nowych klas, zwanych klasami potomnymi, na podstawie klas już istniejących, zwanych klasami bazowymi. Każda klasa pochodna dziedziczy wszystkie właściwości klasy bazowej, rozszerzając ją o nowe atrybuty (pola) i usługi (metody). To już mamy, przejmujemy z klasy Auto Do są nowe elementy, dodane w klasie AutoWKomisie W wyniku dziedziczenia klasa pochodna otrzymuje wszystkie pola i metody klasy bazowej. 100% składowych klasy bazowej występuje w klasie pochodnej. Copyright Roman Simiński Strona : 7

Koncepcja dziedziczenia Klasa Auto jako klasa bazowa klasy AutoWKomisie Auto marka model rokprod nrrej AutoWKomisie cena dataprzyjecia wlasciciel Klasa bazowa Klasa potomna Copyright Roman Simiński Strona : 8

Koncepcja dziedziczenia Klasa Auto jako klasa bazowa klasy AutoWStacjiDiagn Auto marka model rokprod nrrej AutoWStacjiDiagn dataprzegladu nastepnyprzeglad diagnosta Klasa bazowa Klasa potomna Copyright Roman Simiński Strona : 9

Koncepcja dziedziczenia Klasa Auto jako klasa bazowa klasy AutoWSerwisie Auto marka model rokprod nrrej AutoWSerwisie przebieg numerkomputerowy Klasa bazowa Klasa potomna Copyright Roman Simiński Strona : 10

Koncepcja dziedziczenia Klasa bazowa i klasy potomne tworzą hierarchię klas Auto marka model rokprod nrrej AutoWKomisie cena dataprzyjecia wlasciciel AutoWStacjiDiagn dataprzegladu nastepnyprzeglad diagnosta AutoWSerwisie przebieg numerkomputerowy Copyright Roman Simiński Strona : 11

Koncepcja dziedziczenia Klasa bazowa jako klasa ogólna Klasa bazowa (nadklasa) reprezentuje pojęcie bardziej ogólne, znajdujące się na wyższym poziomie abstrakcji. Auto marka model rokprod nrrej AutoWKomisie cena dataprzyjecia wlasciciel AutoWStacjiDiagn dataprzegladu nastepnyprzeglad diagnosta AutoWSerwisie przebieg numerkomputerowy Copyright Roman Simiński Strona : 12

Koncepcja dziedziczenia Klasy pochodne jako klasy specjalizowane Auto marka model rokprod nrrej AutoWKomisie cena dataprzyjecia wlasciciel AutoWStacjiDiagn dataprzegladu nastepnyprzeglad diagnosta AutoWSerwisie przebieg numerkomputerowy Klasy pochodne (podklasay) reprezentuje pojęcie bardziej szczegółowe, specjalizowane, znajdujące się na niższym poziomie abstrakcji. Copyright Roman Simiński Strona : 13

Koncepcja dziedziczenia a generalizacja-specjalizacja jako środek realizacji modeli generalizacja-specjalizacja Pojęcie specjalizacja-generalizacja umożliwia organizowanie klas w struktury hierarchiczne, w których nadklasa reprezentuje pojęcia bardziej ogólne, a podklasa pojęcia specjalizowane. Auto marka model rokprod nrrej AutoWKomisie cena dataprzyjecia wlasciciel Klasa ogólna Generalizacja-specjalizacja Klasa specjalizowana Ogólność i poziom abstrakcji Szczegółowość i niższy poziom abstrakcji Copyright Roman Simiński Strona : 14

Koncepcja dziedziczenia a generalizacja-specjalizacja Jak zweryfikować poprawność wykorzystania dziedziczenia? Reguła is-a (ang. is a kind of) pozwala na sprawdzenie czy zachodzi związek dziedziczenia (specjalizacji generalizacji) pomiędzy klasami. Realizowane jest to poprzez sprawdzenie poprawności zdania: Czy klasa pochodna jest pewnego rodzaju (is-a) klasą bazową? precyzyjniej Czy obiekt klasy pochodnej jest pewnego rodzaju (is-a) obiektem klasy bazowej? Auto marka model rokprod nrrej Czy AutoWKomisie jest pewnego rodzaju Autem? AutoWKomisie cena dataprzyjecia wlasciciel Copyright Roman Simiński Strona : 15

Koncepcja dziedziczenia a generalizacja-specjalizacja Przykład weryfikacji poprawności dziedziczenia Zadajemy dwa pytania: czy obiekt klasy A jest obiektem klasy B? (A is-a B?) czy obiekt klasy B jest obiektem klasy A? (B is-a A?) Możliwe odpowiedzi: zawsze, nigdy czasami. Interpretacja: dwie odpowiedzi nigdy: brak związku specjalizacja-generalizacja, dwie odpowiedzi zawsze: obiekty A i B są synonimiczne (np. dwie różne nazwy dla tej samej klasy) jeżeli: A is-a B = zawsze oraz B is_a A = czasami wtedy A jest specjalizacją B (A is-a B). Copyright Roman Simiński Strona : 16

Koncepcja dziedziczenia a generalizacja-specjalizacja Przykład weryfikacji poprawności dziedziczenia Czy klasa AutoWKomisie jest klasą pochodną klasy Auto: czy obiekt klasy AutoWKomisie jest obiektem klasy Auto? czy obiekt klasy Auto jest obiektem klasy AutoWKomisie? Zawsze Czasami A jak ten test przejdą standardowe przykłady dziedziczenia z popularnych książek o programowaniu obiektowym? Copyright Roman Simiński Strona : 17

Koncepcja dziedziczenia a generalizacja-specjalizacja Przykład weryfikacji poprawności dziedziczenia (x, y) Punkt (x, y) r (x, y) Okrąg Prostokąt w h Rectangle Point Circle w h? x y? r Copyright Roman Simiński Strona : 18

Koncepcja dziedziczenia a generalizacja-specjalizacja Przykład weryfikacji poprawności dziedziczenia (x, y) Punkt (x, y) r (x, y) Okrąg Prostokąt w h Czy klasa Circle jest klasą pochodną klasy Point: czy obiekt klasy Circle jest pewnego rodzaju obiektem klasy Point?? czy obiekt klasy Point jest pewnego rodzaju obiektem klasy Circle?? Czy klasa Rectangle jest klasą pochodną klasy Point: czy obiekt klasy Prostokat jest pewnego rodzaju obiektem klasy Point?? czy obiekt klasy Point jest pewnego rodzaju obiektem klasy Prostokat?? Copyright Roman Simiński Strona : 19

Koncepcja dziedziczenia a związki całość-część Jeżeli nie dziedziczenie to co? Często obiekty łączy relacja is_part czyli jest częścią (ang. is a part of). Relacja ta określana jest pojęciem całość-część. Przy związkach całość-część zadajemy pytania: czy obiekt klasy A jest częścią obiektu klasy B? czy obiekt klasy B zawiera w sobie obiekt klasy A? Klasa obiektu składowego Rectangle Point Circle w h x y r Klasa obiektu-całości Związek całość-część Klasa obiektu-całości Copyright Roman Simiński Strona : 20

Anatomia dziedziczenia w C++ na przykładzie Punkt y (x, y) Punkt3D y (x, y, z) z x x Point Czy Punkt3D jest pewnego rodzaju Punktem? Point3D x y z Copyright Roman Simiński Strona : 21

Anatomia dziedziczenia w C++ na przykładzie Przykład wykorzystania klasy Point i Point3D: #include <iostream> using namespace std; // int main() Point p1( 10, 12 ); Point3D p2( 2, 5, 4 ); cout << endl << "Punkt 2D ma wspolrzedne" << endl; cout << "x = " << p1.getx() << endl; cout << "y = " << p1.gety() << endl; cout << endl << "Punkt 3D ma wspolrzedne" << endl; cout << "x = " << p2.getx() << endl; cout << "y = " << p2.gety() << endl; cout << "z = " << p2.getz() << endl; return EXIT_SUCCESS; Copyright Roman Simiński Strona : 22

Anatomia dziedziczenia w C++ na przykładzie Przykład klasy bazowej Point: class Point public : // Konstruktory Point() : x( 0 ), y( 0 ) Point( int x, int y ) : x( x ), y( y ) // Modyfikator i akcesor dla pola x void setx( int x ) Point::x = x; int getx() const return x; // Modyfikator i akcesor dla pola y void sety( int y ) Point::y = y; int gety() const return y; private: int x, y; ; Copyright Roman Simiński Strona : 23

Anatomia dziedziczenia w C++ na przykładzie Przykład klasy pochodnej Point3D: class Point3D : public Point public : // Konstruktory Point3D() : Point(), z( 0 ) Point3D( int x, int y, int z ) : Point( x, y ), z( z ) // Modyfikator i akcesor dla pola z void setz( int z ) Point3D::z = z; int getz() const return z; private: int z; ; Copyright Roman Simiński Strona : 24

Anatomia dziedziczenia w C++ na przykładzie w trybie publicznym zachowuje widoczność pól określoną w klasie bazowej. Konstruktor klasy pochodnej aktywuje konstruktor klasy bazowej umieszczony na liście inicjalizacyjnej, odbywa się to przed wywołaniem ciała konstruktora. class Point3D : public Point public : // Konstruktory Point3D() : Point(), z( 0 ) Point3D( int x, int y, int z ) : Point( x, y ), z( z ) // Modyfikator i akcesor dla pola z void setz( int z ) Point3D::z = z; int getz() const return z; private: int z; ; Copyright Roman Simiński Strona : 25

Anatomia dziedziczenia w C++ na przykładzie W klasie pochodnej definiujemy metody do obsługi nowych pól, obsługę pól odziedziczonych realizujemy z wykorzystaniem metod odziedziczonych. Używamy konstruktorów klasy bazowej do zainicjowania pól odziedziczonych, nowe pola inicjują własne konstruktory. class Point3D : public Point public : // Konstruktory Point3D() : Point(), z( 0 ) Point3D( int x, int y, int z ) : Point( x, y ), z( z ) // Modyfikator i akcesor dla pola z void setz( int z ) Point3D::z = z; int getz() const return z; private: int z; ; Copyright Roman Simiński Strona : 26

Anatomia dziedziczenia w C++ na przykładzie Punkt y (x, y) Piksel x y x Point Czy Piksel jest pewnego rodzaju Punktem? Pixel x y color Copyright Roman Simiński Strona : 27

Anatomia dziedziczenia w C++ na przykładzie Przykład klasy pochodnej Pixel: class Pixel : public Point public : // Konstruktory Pixel() : Point(), color( 0 ) Pixel( int x, int y, int color ) : Point( x, y ), color( color ) // Modyfikator i akcesor dla pola color void setcolor( int color ) Pixel::color = color; int getcolor() const return color; // Realizator void put() const // Funkcja wyświetl. piksela z odpowiedniej bibl. graficznej, np.: putpixel( getx(), gety(), color ); private: int color; ; Copyright Roman Simiński Strona : 28

Anatomia dziedziczenia w C++ na przykładzie Piksel PikselEkranowy y x y x Ograniczenia minx, miny, maxx, maxy. Pixel Czy PikselEkranowy jest pewnego rodzaju Pikselem? ScrPixel color minx, miny maxx, maxy Copyright Roman Simiński Strona : 29

Anatomia dziedziczenia w C++ na przykładzie Przykład klasy pochodnej ScrPixel: class ScrPixel : public Pixel public : ScrPixel() : Pixel() ScrPixel( int x, int y, int color ) : Pixel( x, y, color ) void setx( int x ) Point::setX( ( x >= minx && x <= maxx )? x : 0 ); void sety( int y ) Point::setY( ( y >= miny && y <= maxy )? y : 0 ); ; static int minx, miny, maxx, maxy; int ScrPixel::minx = 0; int ScrPixel::miny = 0; int ScrPixel::maxx = 799; int ScrPixel::maxy = 599; Copyright Roman Simiński Strona : 30

Ma marginesie pola statyczne Pola statyczne dla danej klasy występują tylko raz, są współdzielone przez wszystkie obiekty tej klasy. Istnieją nawet wtedy, gdy nie został utworzony żaden obiekt klasy. Pola statyczne muszą być zdefiniowane poza klasą, nadaje się im tedy wartość początkową. int ScrPixel::minx = 0; int ScrPixel::miny = 0; int ScrPixel::maxx = 799; int ScrPixel::maxy = 599; Do pól statycznych klasy można odwoływać się bez obiektu: ScrPixel::maxx = screen.getmaxx(); ScrPixel::maxy = screen.getmaxy(); Pola statyczne stanowią wspólną, współdzieloną pamięć wszystkich obiektów danej klasy. Wykorzystywane są do zapamiętywania informacji, które są wspólne dla wszystkich obiektów i nie muszą być pamiętane osobno w każdym z obiektów. Copyright Roman Simiński Strona : 31

Redefinicja metody (funkcji składowej) w klasie pochodnej class Point void setx( int x ) Point::x = x; ; class ScrPixel : public Pixel void setx( int x ) Point::setX( ( x >= minx && x <= maxx )? x : 0 ); ; W klasie pochodnej można zmienić sposób działania metody odziedziczonej poprzez jej redefinicję. Do metody odziedziczonej można dalej odwoływać się stosując prefiks w postaci nazwa_klasy_bazowej::. Redefinicję metody w klasie pochodnej stosujemy wtedy, gdy nie odpowiada nam działanie metody odziedziczonej. Można napisać własną implementację metody, opcjonalnie posługując się również metodą odziedziczoną. Copyright Roman Simiński Strona : 32

Składowe chronione W klasie pochodnej nie ma bezpośredniego dostępu do pól prywatnych klasy bazowej. class Pixel : public Point public : void put() const putpixel( getx(), gety(), color ); ; Przewidując, że pewna klasa będzie wykorzystywana jako klasa bazowa, można zadeklarować jej składowe (pola i metody) jako chronione protected: Składowe zadeklarowane jako protected są dostępne dla obiektów wszystkich klas pochodnych (tak jak składowe public). Składowe zadeklarowane jako protected są niedostępne dla obiektów innych, niezaprzyjaźnionych klas (tak jak składowe private). Specyfikator protected działa jak private, z tym wyjątkiem, że obiekty klas pochodnych otrzymują dostęp do składowych protected klasy bazowej. Copyright Roman Simiński Strona : 33

Składowe chronione Deklaracja pól x i y jako chronionych: class Point public : protected: int x, y; ; class Pixel : public Point public : void put() const putpixel( x, y, color ); // Dozwolone bezpośrednie odwołanie do x i y ; Point p; p.x = 10; // Błąd, składowa x jest chroniona! Copyright Roman Simiński Strona : 34

Na marginesie destruktory Destruktor to funkcja wywoływana automatycznie przez kompilator bezpośrednio przed momentem, w którym obiekt przestaje żyć. Moment śmierci obiektu zależy od tego, w jaki sposób został on utworzony. Obiekty statyczne giną po zakończeniu wykonania funkcji main, obiekty automatyczne po wyjściu sterowania z bloku w którym zostały zdefiniowane, obiekty dynamicze w momencie usunięcia ich z pamięci operatorem delete. Destruktor to bezparametrowa funkcja, bez określonego rezultatu, o nazwie takiej, jak nazwa klasy poprzedzona znakiem tyldy ~. class Point public: // Destruktor ~Point(); ; class ScrPixel public: // Destruktor ~ScrPixel(); ; Copyright Roman Simiński Strona : 35

Na marginesie destruktory Klasa Point ze zmodyfikowanymi konstruktorami i destruktorem class Point public : // Konstruktory Point() : x( 0 ), y( 0 ) cout << endl << "Point()" << endl; Point( int x, int y ) : x( x ), y( y ) cout << endl << "Point( " << x << ", " << y << " )" << endl; // Destruktor ~Point() cout << endl << "~Point()" << endl; ; Copyright Roman Simiński Strona : 36

Na marginesie destruktory Aktywowanie konstruktora i destruktora dla obiektu klasy Point: cout << endl << "Przed utworzeniem obiektu p klasy Point" << endl; Point p( 1, 10 ); cout << endl << "Punkt ma wspolrzedne" << endl; cout << "x = " << p.getx() << endl; cout << "y = " << p.gety() << endl; cout << endl << "Po usunieciu obiektu p klasy Point" << endl; Obiekt zaczyna żyć, aktywowanie konstruktora Obiekt umiera, aktywowanie destruktora Copyright Roman Simiński Strona : 37

Kolejność aktywowania konstruktorów i destruktorów a dziedziczenie Klasa Point3D ze zmodyfikowanymi konstruktorami i destruktorem class Point3D : public Point public : // Konstruktory Point3D() : Point(), z( 0 ) cout << endl << "Point3D()" << endl; ; Point3D( int x, int y, int z ) : Point( x, y ), z( z ) cout<< endl << "Point3D( " << x << ", " << y << ", " << z << " )" << endl; // Destruktor ~Point3D() cout << endl << "~Point3D()" << endl; Copyright Roman Simiński Strona : 38

Kolejność aktywowania konstruktorów i destruktorów a dziedziczenie Klasa Pixel ze zmodyfikowanymi konstruktorami i destruktorem class Pixel : public Point public : // Konstruktory Pixel() : Point(), color( 0 ) cout << endl << "Pixel()" << endl; ; Pixel( int x, int y, int color ) : Point( x, y ), color( color ) cout<< endl<< "Pixel( "<< x << ", " << y << ", " << color << " )" << endl; // Destruktor ~Pixel() cout << endl << "~Pixel()" << endl; Copyright Roman Simiński Strona : 39

Kolejność aktywowania konstruktorów i destruktorów a dziedziczenie Klasa ScrPixel ze zmodyfikowanymi konstruktorami i destruktorem class ScrPixel : public Pixel public : // Konstruktory ScrPixel() : Pixel() cout << endl << "ScrPixel()" << endl; ; ScrPixel( int x, int y, int color ) : Pixel( x, y, color ) cout<< endl<< "ScrPixel( "<< x << ", "<< y << ", "<< color << " )"<< endl; // Destruktor ~ScrPixel() cout << endl << "~ScrPixel()" << endl; Copyright Roman Simiński Strona : 40

Kolejność aktywowania konstruktorów i destruktorów a dziedziczenie Aktywowanie konstruktora i destruktora dla obiektu klasy Point3D: cout << endl << "Przed utworzeniem obiektu p klasy Point3D" << endl; Point3D p( 2, 5, 4 ); cout << endl << "Punkt 3D ma wspolrzedne" << endl; cout << "x = " << p.getx() << endl; cout << "y = " << p.gety() << endl; cout << "z = " << p.getz() << endl; cout << endl << "Po usunieciu obiektu p klasy Point3d" << endl; Aktywowanie konstruktora klasy bazowej Aktywowanie konstruktora własnego klasy Aktywowanie destruktora własnego klasy Aktywowanie destruktora klasy bazowej Copyright Roman Simiński Strona : 41

Kolejność aktywowania konstruktorów i destruktorów a dziedziczenie Aktywowanie konstruktora i destruktora dla obiektu klasy Point3D: cout << endl << "Przed utworzeniem obiektu p klasy ScrPixel" << endl; ScrPixel p( 10, 5, 0 ); cout << endl << "Piksel ma wspolrzedne" << endl; cout << "x = " << p.getx() << endl; cout << "y = " << p.gety() << endl; cout << endl << "Po usunieciu obiektu p klasy ScrPixel" << endl; Aktywowanie konstruktorów klas bazowych Aktywowanie konstruktora własnego klasy Aktywowanie destruktora własnego klasy Aktywowanie destruktorów klas bazowych Copyright Roman Simiński Strona : 42