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

Podobne dokumenty
Dziedziczenie. Ogólna postać dziedziczenia klas:

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

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

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

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

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

TEMAT : KLASY DZIEDZICZENIE

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

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

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

Przeciążenie operatorów

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

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

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

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Mechanizm dziedziczenia

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

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

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

PARADYGMATY PROGRAMOWANIA Wykład 4

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

Programowanie obiektowe w C++ Wykład 12

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.

Wykład 8: klasy cz. 4

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

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

Wstęp do programowania

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.

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

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

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

Szablony klas, zastosowanie szablonów w programach

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

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

Przekazywanie argumentów wskaźniki

Język C++ zajęcia nr 2

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

Wstęp do Programowania 2

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

Dziedziczenie jednobazowe, poliformizm

Rozdział 4 KLASY, OBIEKTY, METODY

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

Wykład 5: Klasy cz. 3

Do czego służą klasy?

PARADYGMATY PROGRAMOWANIA Wykład 2

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

Podstawy programowania skrót z wykładów:

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

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

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.

Programowanie obiektowe w języku

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

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Wykład 4: Klasy i Metody

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

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

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

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

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

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

Podstawy Programowania Obiektowego

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

Wstęp do programowania obiektowego, wykład 7

Podstawy Programowania Obiektowego

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

Konstruktor kopiujacy

Programowanie w języku C++

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Materiały do zajęć VII

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

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

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

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

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

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

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

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Mechanizm dziedziczenia

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

Laboratorium nr 10. Temat: Funkcje cz.2.

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

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

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

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

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie obiektowe i C++ dla matematyków

dr inż. Jarosław Forenc

TEMAT : KLASY POLIMORFIZM

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

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Programowanie - wykład 4

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

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

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Laboratorium 1 - Programowanie proceduralne i obiektowe

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

Plik klasy. h deklaracje klas

Transkrypt:

Wprowadzenie w dziedziczenie Klasa D dziedziczy klasę B: B klasa bazowa D klasa pochodna Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class). Najpierw jest tworzona klasa bazowa, która zawiera elementy wspólne dla wszystkich obiektów klas pochodnych. Klasa bazowa to najbardziej ogólny opis. Klasy, utworzone na podstawie klasy bazowej, nazywamy klasami pochodnymi. Klasa pochodna ma wszystkie cechy klasy bazowej oraz dodatkowe rozszerzenia. 1

Przykład W4_0: //deklaracje klasy bazowej class B //protected: int i; public: void set_i(int n); int get_i(); ; //deklaracje klasy pochodnej class D : public B int j; public: void set_j(int n); int mul(); ; Deklaracje klasy pochodnej: class D : public B class nazwa_klasy_pochodnej : public nazwa_clasy_bazowej 2

Kluczowe słowo public oznacza: składowe publiczne klasy bazowej stają składowymi publicznymi klasy pochodnej składowe prywatne klasy bazowej pozostają niedostępnymi dla klasy pochodnej klasa pochodna nie ma dostępu bezpośredniego do tych składowych dane prywatne klasy bazowej mogą być udostępnione w klasie pochodnej tylko przez metodę publiczne klasy bazowej (albo poprzez deklaracje protected). W przykładzie podanym: Funkcja get_i() jest metodą klasy bazowej, przecież jest bezpośrednio dostępną w zasięgu klasy pochodnej (metoda D::mul()) składowe publiczne klasy bazowej stają składowymi publicznymi klasy pochodnej. Bezpośredni dostęp do zmiennej prywatnej klasy bazowej B::i w zasięgu klasy pochodnej (wewnątrz klasy pochodnej) jest wzbroniony zasada hermetyzacji (inkapsulacji). Więc dla udostępnienia tej zmiennej używamy metodą get_i() (albo zmieniamy specyfikator dostępu z private na protected). Obiekt klasy pochodnej składa się ze składowych klasy pochodnej oraz z składowych klasy bazowej (przykład W4_0 debugger). 3

Ogólna postać dziedziczenia: class nazwa_clasy_pochodnej : specyfikator_dostępu nazwa_clasy_bazowej //ciało nowej klasy ; specyfikator_dostępu public [private] [protected] Będziemy na razie rozważali tylko specyfikator dostępu public. 4

Definicje wskaźników do obiektów: Wskaźniki do obiektów MY_CLASS ob; MY_CLASS *ptr_ob; ptr_ob = &ob; ob.i = ptr_ob->i = ob.show(); ptr_ob->show(); MY_CLASS obb[20]; ptr_ob = obb; ptr_ob++; ptr_ob = &obb[0]; ptr_ob += 10; //deklaracja obiektu powoduje wydzielenie pamięci // dla całego obiektu, wywołuje konstruktor // deklaracja wskaźnika do obiektu. Wydziela 4 B //pamięci dla wskaźnika. Wskaźnik jest na razie //nie zainicjowany //Teraz ptr_ob wskazuje na obiekt ob. //Dostęp do publicznej składowej obiektu ob //To samo, dostęp przez wskaźnik //wywołanie metody klasy //to samo, przez wskaźnik //deklaracja tablicy obiektów //ptr_ob wskazuje na zerowy element tablicy //ptr_ob wskazuje na pierwszy element tablicy //ptr_ob wskazuje na zerowy element tablicy //ptr_ob wskazuje na 10 element tablicy 5

class area_cl double width; public: double get_width() return width; void set_width(double a) width = a; ; int main() area_cl obb[20]; int it; for(it=0; it<20; it++) obb[it].set_width((double)(it)); area_cl *ptr_ob = NULL; ptr_ob = obb; for(it=0; it<20; it++, ptr_ob++) if(fabs(ptr_ob->get_width()-obb[it].get_width()) > 1.0e-9) cout << "error\t"; return 0; 6

Klasy, struktury, unie W C++ niema różnicy podstawowej pomiędzy klasą a strukturą. Struktura może zawierać nie tylko dane, a i funkcje. Różni się struktura od klasy tym, że domyślne składowe klas są prywatne, a struktur publiczne. Żeby element struktury zadeklarować jako składową prywatną, należy użyć kluczowe słowo private. Chocza struktura może zawierać i metody, zwykłe programiści używają struktury dla przedstawienia danych, a dla przedstawienia obiektów klasy. Instrukcja union podobnie jak struktura może być wykorzystywana do definiowania klas unie mogą zawierać zarówno funkcje składowe, jak i dane. Mogą mieć konstruktor i destruktor. Najważniejsze jest umieszczanie wszystkich danych w tym samym obszarze pamięci. Składowe unii domyślne są publiczne. Na różnice od klas unie nie mogą dziedziczyć ani żadnych klas, ani typów. Unia nie może być klasą bazową. Składowymi unii nie mogą być: o funkcje wirtualne o zmienne statyczne o zmienne referencyjne 7

o obiekt z przeciążonym operatorem = o obiekty, dla których w sposób jawny zdefiniowano konstruktor lub destruktor Unie anonimowe nie zawierają nazwę typu. Nie można deklarować obiektów typu, definiowanego przez taką unię. Unie anonimowe informują kompilator, że ich zmienne składowe będą znajdowali się w tym samym obszarze pamięci. Dostęp do składowych unii anonimowej odbywa się bezpośrednie: union int i; char ch[4]; i = 4; ch[0] = X ; o Globalne unie anonimowe mogą być zadeklarowane tylko jako static o Unii anonimowe nie mogą zawierać składowych prywatnych o Nazwy składowych unii anonimowej nie powinni konfliktować z innymi nazwami zmiennych w zasięgu deklaracji. Przykład Union_1 8

Funkcje wplatane (inline) To są krótkie funkcje, które w rzeczywistości nie są wywoływane. Zamiast tego ich ciało pozostaje wbudowano w kod programu w miejscu jej wywołania. Taka technika nadaje możliwość obejść mechanizm wywołania funkcji, związany z procedurą tworzenia steku argumentów formalnych, przekazania wartości argumentów aktualnych, zwracania wartości (return value), itp. Dla tego inline funkcji będą wykonane znacznie szybszej od wywołania zwykłego. To jest zaletą funkcji wplatanych. Wadą funkcji wplatanych jest to, że jeśli kod takich funkcji jest długi i funkcje wplatane są wywołane zbyt często, objętość programu będzie drastycznie rosła. Definicje inline funkcji: 9

#include <iostream> using namespace std; inline int even(int x) return (x%2); int main() if (even (10)) cout << 10 jest wartość nieparzysta << endl; //(10%2) = 0 cout nie wykon. if (even (11)) cout << 11 jest wartość nieparzysta << endl; //(11%2) = 1 cout wykon. Inline funkcja musi być zdefiniowaną przed pierwszym wywołaniem. (Inaczej kompilator nie wie, który kod ma wplatać). Specyfikator inline nie jest poleceniem, tylko żądaniem kompilator może jego ignorować. Przy ignorowaniu inline funkcja będzie wywołana jako zwykła. 10

W zależności od typu kompilatora mogą być szereg ograniczeń: o o o funkcja nie musi być rekursywną nie musi zawierać zmienne statyczne nie musi mieć instrukcje pętli lub switch lub goto Jeśli takie ograniczenie istnieje, zamiast inline będzie generowane wywołanie zwykłe. Funkcje składowe klasy również mogą być wplatane 11

#include <iostream> using namespace std; class samp int i; public: samp(int a); int get_i(); ; samp::samp(int a) i = a; inline int samp::get_i() return i; 12

Funkcji inline można używać w deklaracje klasy: class samp int i, j; public: samp(int a, int b) i = a; j = b; //kilka linij kodu inline - funkcje int get_i() return i; int get_j() return j; //inline funkcja umieszczona w jedną linie kodu //to jest najbardziej wspierany styl śród programistów Przy takim stylu specyfikator inline jest pominięty. Funkcje inline można przeciążyć, przy tym wszystkie realizacje mają być też inline 13

Przypisanie obiektów Jeśli typ dwóch obiektów jest taki samy, to jeden obiekt można przypisać drugiemu. Domyślnie przypisanie jednego obiektu drugiemu oznacza, że dane obiektu, znajdującego się z prawej strony, zostaną skopiowane do obiektu znajdującego się z lewej strony bit po bicie. class myclass int i; public: void set_i(int ii); int get_i(); ; int main() myclass ob1, ob2; ob1.set_i(10); ob2 = ob1; cout << ob1.get_i() << \t << ob2.get_i() << endl;.. WYDRUK: 10 10 14

Przypisanie obiektów Jeśli dane klasy zawierają wskaźnik(i) do obiektów dowolnego typu (do tablic typów wbudowanych), przypisanie domyślne powoduje błąd przykład W4_1 Dla tego, żeby uniknąć takiej sytuacji, operator przypisania trzeba przeciążyć. Będziemy rozważali to później. Przekazywanie obiektów do funkcji Obiekty mogą być przekazywane do funkcji w ten sam sposób, co zmienne innych typów. Domyślnie, obiekty są przekazane do funkcji przez wartość. Oznacza to, że tworzona jest kopia obiektu, następnie przekazywana do funkcji. Więc dowolne zmiany danych, dokonywane funkcją, to są zmiany kopii obiektu, a nie samego obiektu, i nie wpływają na sam obiekt. Funkcji można przekazać adres obiektu. W takim razie jest tworzona kopia wskaźnika do obiektu, która zawiera adres obiektu. W funkcji dostęp do 15

składowych obiektu będzie dokonywany przez adres obiektu, więc wszystkie zmiany pozostaną wprowadzone na danych samego obiektu. Przykład W2_0: Przekazanie obiektu funkcji przez wartość powoduje tworzenie kopii tego obiektu powstaje nowy obiekt. Przy wyjściu z ciała funkcji kopia obiektu wychodzi poza zasiąg deklaracji kopia powinna być zniszczona. Przy tworzeni kopii obiektu konstruktor dla kopii się nie wywołuje. Przy wyjściu z ciała funkcji wywołuje się destruktor kopii. Przy tworzeni kopii obiektu wywołanie konstruktora dla kopii powodowało by inicjowanie danych zamiast przekazania ich wartości od oryginała obiektu do kopii. Dla tego konstruktor kopii się nie wywołuje. Kopia obiektu jest tworzona w steku, więc kiedy działanie funkcji się skończy (to się zwykłe odbywa kiedy funkcja zwraca swoją wartość), kopia obiektu podlega zniszczeniu dla tego będzie wywołany destruktor. Przykład W2_1: 16

Domyślnie (jeśli nie pozostał zdefiniowany przez programista tak zwany konstruktor kopiujący) kopia jest tworzona na poziomie bitowym jest dokładnym duplikatem oryginału. Ten fakt może powodować istotne problemy, związane z efektami ubocznymi. Jeśli na przykład obiekt, przekazywany przez listę argumentów funkcji, dynamicznie alokuje pamięć, a następnie, gdy jest zniszczony, zwalnia ją, to przekazana do funkcji kopia będzie podczas wywołania destruktora zwalniała tą samą pamięć. W rezultacie oryginalny obiekt pozostanie uszkodzony. Przykład W2: Istnieje 2 wyjścia z tej sytuacji. Pierwsze to jest przekazanie wskaźnika do obiektu przez listę argumentów funkcji. Wtedy nie wynika omówionych powyżej efektów ubocznych. Oprócz tego, to jest dość szybki i skuteczny sposób wywołania funkcji: przy wypełnieni steku jest tworzona kopia tylko wskaźnika zmiennej 4 B, a nie całego obiektu, który może zawierać duży obszar danych. Wadą takiego podejścia jest to, że dostęp przez wskaźnik nie chroni obiekt od zmian, 17

dokonywanych w funkcji. Kontrole takiego kodu wymaga wysokiej uwagi od programisty, dla tego że zmiany obiektu mogą być dokonywane na dolnym poziomie. Drugie wyjście to tworzenie tak zwanych konstruktorów kopiujących. Będziemy to rozważali później. Istnieją przypadki, kiedy do funkcji trzeba przekazać tylko wskaźnik do obiektu przykład allocator. 18