Dziedziczenie. Ogólna postać dziedziczenia klas:

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

Programowanie obiektowe w języku

Wprowadzenie do programowanie obiektowego w języku C++

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

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

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

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

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

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

Abstrakcyjny typ danych

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

Mechanizm dziedziczenia

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

TEMAT : KLASY DZIEDZICZENIE

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

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

Dziedziczenie jednobazowe, poliformizm

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

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

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.

dr inż. Jarosław Forenc

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

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

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

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

Przeciążenie operatorów

Programowanie Obiektowe i C++

PARADYGMATY PROGRAMOWANIA Wykład 2

PARADYGMATY PROGRAMOWANIA Wykład 4

Wykład 5 Okna MDI i SDI, dziedziczenie

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

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

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

Wykład 8: klasy cz. 4

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

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

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

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

Język C++ Programowanie obiektowe

Programowanie Obiektowe i C++

Rozdział 4 KLASY, OBIEKTY, METODY

Programowanie 2. Język C++. Wykład Relacje między klasami, klasy zagnieŝdŝone, klasy lokalne

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

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.

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

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

Mechanizm dziedziczenia

Programowanie obiektowe

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

Enkapsulacja, dziedziczenie, polimorfizm

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Programowanie obiektowe

Programowanie obiektowe w C++ Wykład 12

Wykład 5: Klasy cz. 3

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

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

Dziedziczenie wielobazoweuzupełnienie

C++ - [4-7] Polimorfizm

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

Podstawy Programowania Obiektowego

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

Zaawansowane programowanie w C++ (PCP)

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

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

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

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

.NET Klasy, obiekty. ciąg dalszy

Programowanie obiektowe

Programowanie obiektowe

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

Zaawansowane programowanie w C++ (PCP)

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

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

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Tbli Tablice obiektów biktó są tworzone dokładnie d tak samo, jak i tablice, składające się z elementów innego typu

Wykład 4: Klasy i Metody

OBIEKTY PHP. G. Panuś

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Plik klasy. h deklaracje klas

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Materiały do zajęć VII

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

Do czego służą klasy?

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

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

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

Programowanie, część I

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

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

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

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

Wprowadzenie do programowanie obiektowego w języku C++

Programowanie obiektowe i zdarzeniowe

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

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

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM

Podstawy programowania III

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

Transkrypt:

Dziedziczenie Ogólna postać dziedziczenia klas: class nazwa_clasy_pochodnej : specyfikator_dostępu nazwa_clasy_bazowej specyfikator_dostępu : public private protected Specyfikator dostępu definiuje, w jaki sposób składowe klasy bazowej dziedziczą się klasą pochodną. Jeśli specyfikator dostępu nie pozostał określony, domyślnie jest przyjęte: dla klasy pochodnej, zadeklarowanej z słowem kluczowym class, jako private; z słowem kluczowym struct jako public. Dla czytelności programu - jawnie zadawać specyfikator dostępu. public: o składowe publiczne klasy bazowej stają publicznymi składowymi klasy pochodnej (bezpośrednio dostępnymi wewnątrz i pochodnej) o składowe prywatne klasy bazowej pozostają prywatnymi składowymi klasy pochodnej. To oznacza, że dostęp do tych składowych jest możliwy tylko przez funkcje typu get_val() jak w klasie pochodnej, tak i zewnątrz klasy pochodnej 1

o składowe chronione (protected) klasy bazowej stają składowymi chronionymi klasy pochodnej - bezpośrednio dostępnymi składowymi w klasie pochodnej, przecież pozostają ukrytymi pochodnej i klasy bazowej private: o składowe publiczne klasy bazowej stają prywatnymi składowymi klasy pochodnej. Wewnątrz klasy pochodnej bezpośredni dostęp do tych składowych istnieje, zewnątrz nie istnieje. Klasa pochodna może udostępnić publiczne składowe klasy bazowej przez swoi metody get_derived() lub przewrócić ich. o składowe prywatne klasy bazowej pozostają prywatnymi składowymi klasy pochodnej. Klasa pochodna nie ma dostępu bezpośredniego do tych składowych (dostęp tylko przez metody klasy bazowej), zewnątrz dostęp do ukrytych składowych klasy bazowej przez metody klasy bazowej jest niemożliwy (metody klasy bazowej stają składowymi ukrytymi klasy pochodnej). Klasa pochodna może udostępnić te dane tylko przez swoi metody specjalne get_derived_val(get_val()), gdzie get_val() metoda klasy bazowej. 2

o składowe chronione (protected) klasy bazowej stają składowymi prywatnymi klasy pochodnej - są dostępne bezpośrednio w klasie pochodnej i nie są dostępne pochodnej. protected: o składowe publiczne klasy bazowej stają składowymi chronionymi klasy pochodnej o składowe prywatne klasy bazowej pozostają składowymi prywatnymi klasy pochodnej o składowe chronione (protected) klasy bazowej pozostają składowymi chronionymi klasy pochodnej Przykład: W9_0 Przewrócenie składowych publicznych kłasy bazowej przy dziedziczeni jako private: 3

class B int i; public: int j;... class D : private B public: B::j; //przewrócenie publicznej składowej klasy bazowej //do statusu public przy dziedziczeni jako private B::i; //błąd! I składowa ukryta kłasy bazowej int main() D ob; ob.j = 20; //OK return 0; 4

Specyfikator dostępu składowej klasy bazowej Klasa pochodna dziedziczy się jako : public : private : protected public: (składowa jest dostępna zewnątrz klasy bazowej ob.i = // OK) pochodnej: jest dostępna pochodnej: jest dostępna pochodnej: jest dostępna dostępna (get_v_dr()) pochodnej: jest dostępna dostępna (get_v_dr()) private: (składowa nie jest dostępna zewnątrz klasy bazowej ob.i = //!OK) dostępna (get_val()) dostępna (get_val()) dostępna (get_val()) dostępna!(get_val()) get_v_dr (get_val()) dostępna (get_val()) dostępna!(get_val()) get_v_dr (get_val()) protected: (składowa nie jest dostępna zewnątrz klasy bazowej ob.i = //!OK) pochodnej: jest dostępna dostępna (get_val()) pochodnej: jest dostępna dostępna!(get_val()) get_v_dr () pochodnej: jest dostępna dostępna!(get_val()) get_v_dr () 5

Konstruktory, destruktory i dziedziczenie Jeśli klasa bazowa i klasa pochodna mają konstruktory i destruktory, to kolejność wywołań jest taka: o konstruktor klasy bazowej o konstruktor klasy pochodnej o destruktor klasy pochodnej o destruktor klasy bazowej Klasa bazowa nic nie wie o istnieniu klasy pochodnej inicjowanie w klasie bazowej jest wykonywane niezależnie od klasy pochodnej. Inicjowanie klasy bazowej może być podstawą dla inicjowania klasy pochodnej. Dla tego konstruktor klasy bazowej jest wywołany wcześniej od konstruktora klasy pochodnej. Przy niszczeniu obiektów niszczenie klasy bazowej powodowało by uszkodzenie obiektu klasy pochodnej. Dla tego konstruktor klasy pochodnej ma być wywołany wcześniej od konstruktora klasy bazowej. 6

Przekazanie argumentów konstruktorowi klasy bazowej: o wszystkie argumenty klasy pochodnej, a również, klasy bazowej, pozostają przekazane konstruktorowi klasy pochodnej. o argumenty klasy bazowej pozostają przekazane do klasy bazowej: konstr_klasy_pochod(lista_argum) : konstr_klasy_bazowej(lista_argum_baz) //ciało konstruktora klasy pochodnej lista_argum lista argumentów klasy pochodnej i klasy bazowej lista_argum_baz lista argumentów klasy bazowej Przykład: W9 7

Przykład: class base int i; public: base(int ii) i = ii; class derived : public base int j; public: derived(int ii) : base(ii) j=0; //przekazanie argumentu do klasy bazowej //klasa pochodna argumentów nie potrzebuje Wielodziedziczenie. B D1 D2 Wielopoziomowa hierarchie klas Klasa pochodna dziedziczy kilka klas bazowych B1 D B2 8

B Przy hierarchii klas wielopoziomowej konstruktory się wywołują w tej kolejności, w którą te klasy dziedziczą, a destruktory w odwrotnej kolejności: D1 D2 o konstruktor B o konstruktor D1 o konstruktor D2 o destruktor D2 o destruktor D1 o destruktor B Deklaracje klas pochodnych: class D1 : public B class D2 : public D1 B1 B2 Jeśli klasa pochodna dziedziczy kilka klas bazowych, deklaracje klasy pochodnej jest taka: class D : public B1, public B2 D class nazwa_clasy_pochod: specyf_dostępu nazwa_klasy_bazowej_1, specyf_dostępu nazwa_klasy_bazowej_2, specyf_dostępu nazwa_klasy_bazowej_n 9

Konstruktory są wywołane w kolejności tworzenia klas, w porządku od lewej do prawej, czyli tak, jak klasy bazowe zostały wymienione na liście dziedziczenia. Destruktory są wywołane w odwrotnej kolejności, od prawej do lewej: konstruktor B1 konstruktor B2 konstruktor D destruktor D destruktor B2 destruktor B1 A w takim przypadku konstruktory i destruktory będą wywołane tak: class D : private B2, private B1 konstruktor B2 konstruktor B1 konstruktor D destruktor D destruktor B1 destruktor B2 10

Przekazywanie argumentów konstruktorom klas bazowych konstr_klasy_pochod(lista_argum) : nazwa_klasy_bazow_1(lista_arg_1), nazwa_klasy_bazow_2(lista_arg_2),, nazwa_klasy_bazow_n(lista_arg_n) // konstruktor klasy pochodnej lista_argum ogólna lista argumentów dla klasy pochodnej i wszystkich klas bazowych lista_argum_1 lista argumentów dla klasy bazowej 1, lista_argum_2 lista argumentów dla klasy bazowej 2,. lista_argum_n lista argumentów dla klasy bazowej N Przykłady W9_1, W9_2 11

Rozważymy taką sytuacje przykład W10_2 B B D1 D2 D3 Hierarchia klas Przy takiej hierarchii klas powstaje niejednoznaczność. Niech klasa B ma składową int i. Wtedy klasy D1, D2 (pochodne od klasy B, więc każda z tych klas zawiera swoją własną kopie klasy bazowej) będą mieli dwa rożne egzemplarze składowej i, które się znajdują w różnych adresach pamięci. Klasa D3 dziedziczy klasy D1, D2. Więc w klasie D3 powstają 2 egzemplarze składowej i. Który egzemplarz składowej i powinni ż my pobrać? 12

Klasy wirtualne zapobiegają powstaniu dwóch kopii w takiej sytuacji: class D1 : virtual public B class D2 : virtual public B class D3 : public D1, public D2 Przykład W10_3. Jeśli klasa bazowa B została oddziedziczona przez D1, D2 jako klasa wirtualna, jednak kopia tej klasy bazowej powstaje pochodnej. D1 ob(20, 4); //OK cout << ob.get_i() << endl; //OK Różnica pomiędzy klasą zwykłą i wirtualną pojawia się wtedy, gdy obiekt dziedziczy klasą bazową więcej niż jeden raz. 13

Przykład Schildt_7_Usw_3! 14