class nazwa_klasy: tryb_dziedziczenia klasa_bazowa { lista deklaracji pól lista deklaracji metod };

Podobne dokumenty
TEMAT : KLASY DZIEDZICZENIE

dr inż. Jarosław Forenc

Mechanizm dziedziczenia

Podstawy Programowania Obiektowego

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

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

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

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

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

Wykład 8: klasy cz. 4

Dziedziczenie jednobazowe, poliformizm

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

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

Technologie i usługi internetowe cz. 2

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

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

Mechanizm dziedziczenia

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

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

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

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

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

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Programowanie obiektowe

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

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

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

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Do czego służą klasy?

Wprowadzenie do programowanie obiektowego w języku C++

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

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

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

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

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

Laboratorium 1 - Programowanie proceduralne i obiektowe

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

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

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

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

PARADYGMATY PROGRAMOWANIA Wykład 2

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe - 1.

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

Wykład 5: Klasy cz. 3

Programowanie komputerowe. Zajęcia 7

Dziedziczenie. Ogólna postać dziedziczenia klas:

Wykład 9: Polimorfizm i klasy wirtualne

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

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Programowanie obiektowe w języku

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

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

Do czego służą klasy?

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

Rozdział 4 KLASY, OBIEKTY, METODY

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

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

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

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

TEMAT : KLASY POLIMORFIZM

KLASY cz.1. Dorota Pylak

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

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

Materiały do zajęć VII

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.

Podstawy Programowania Obiektowego

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

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

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

C++ - [4-7] Polimorfizm

Enkapsulacja, dziedziczenie, polimorfizm

Wstęp do Programowania 2

Podstawy Języka Java

Programowanie obiektowe

Język programowania. Andrzej Bobyk

OBIEKTY PHP. G. Panuś

Dokumentacja do API Javy.

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

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

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

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Programowanie w Javie 1 Wykład i Ćwiczenia 2 Przegląd podstawowych klas w Javie (elementy programowania obiektowego) Płock, 16 października 2013 r.

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

.NET Klasy, obiekty. ciąg dalszy

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

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

Programowanie obiektowe w C++ Wykład 12

Szablony klas, zastosowanie szablonów w programach

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

Programowanie obiektowe

Kurs WWW. Paweł Rajba.

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

Transkrypt:

3.9 Programowanie obiektowe 3.9 Programowanie obiektowe 3.9.1 Klasy i obiekty Programowanie obiektowe jest techniką programowania umożliwiającą przedstawianie problemu w postaci logicznie powiązanych ze sobą danych, struktur danych i funkcji, które wymieniają pomiędzy sobą informacje. Klasa to typ obiektowy. Definicja klasy ma następującą postać: class nazwa_klasy: tryb_dziedziczenia klasa_bazowa lista deklaracji pól lista deklaracji metod ; gdzie: lista deklaracji pól zawiera deklaracje pól klasy będące deklaracjami danych lub struktur danych; lista deklaracji metod zawiera deklaracje metod klasy będące deklaracjami funkcji zawartych w klasie; tryb_dziedziczenia klasa_bazowa zawiera tryb dziedziczenia z klasy poprzedniej w hierarchii klas. Pola (czyli dane składowe) to zmienne zdefiniowane wewnątrz klasy, natomiast metody (czyli funkcje składowe) to funkcje zadeklarowane w klasie. Pola i metody zawarte w jednej klasie to składowe klasy. Dostęp do pól powinien odbywać się wyłącznie przy wykorzystaniu metod. Metody zawierają czynności wykonywane na polach. Z klasą wiąże się pojęcie enkapsulacja (ang. encapsulation), które oznacza zgromadzenie w jednej definicji zarówno pól, jak i metod. Poznaliśmy już znaczenie pojęcia klasa. Czym jest więc obiekt? Obiekt to złożona struktura danych o ustalonej liczbie elementów, na które składają się pola i metody. Obiekt nazywamy również zmienną typu obiektowego. Klasa jest typem obiektu, a nie obiektem. Definiując klasę, nie tworzymy żadnych obiektów. 287

Rozdział 3. Programowanie w języku C++ Klasę, której nie reprezentuje żaden obiekt, nazywamy klasą abstrakcyjną. Deklaracje elementów składowych klasy można poprzedzić słowami kluczowymi określanymi jako specyfikatory dostępu do składowych klasy: public, protected, private. Jeżeli składowe klasy nie są poprzedzone żadną z tych etykiet, kompilator przyjmuje domyślnie specyfikator private. Specyfikatory sterują dostępem do składowych klasy. Składowe, które zadeklarowano w sekcji public, są dostępne w całym programie. Jeżeli umieścimy je w sekcji private, będziemy mieli do nich dostęp jedynie w funkcjach składowych klasy i w funkcjach zaprzyjaźnionych. Składowe zadeklarowane w sekcji protected są dostępne w funkcjach składowych klasy i w funkcjach składowych jej klas pochodnych (czyli dziedziczących). Hermetyzacja to cecha programowania obiektowego polegająca na ukrywaniu wybranych składowych klasy przed bezpośrednim dostępem z zewnątrz. Do metod i pól ukrytych o ograniczonym dostępie (czyli znajdujących się w sekcjach private lub protected) możemy dotrzeć jedynie poprzez metody publiczne. Przykład 3.55 Napiszmy program (prog3_43.cpp), w którym zostanie zdefiniowana klasa osoba (zawierająca pola: nazwisko, imie, wiek i metody: wczytaj(), wypisz()) oraz utworzone zostaną dwa obiekty klasy osoba: O1 i O2. Program ma realizować wczytywanie danych do pól i wypisywanie zawartości pól na ekranie. Dostęp do pól powinien być ograniczony tylko poprzez metody. #include <iostream> using namespace std; class osoba //definicja klasy char nazwisko[25]; //sekcja prywatna char imie[20]; int wiek; //sekcja publiczna void wczytaj(char *n, char *i, int w); //deklaracja metody 288

3.9 Programowanie obiektowe void wypisz() //definicja metody wewnątrz klasy cout<<"\n"<<imie<<" "<<nazwisko<<endl; cout<<"wiek: "<<wiek<<endl; ; //koniec definicji klasy void osoba::wczytaj (char *n, char *i, int w) //definicja metody poza klasą strcpy(nazwisko,n); strcpy(imie,i); wiek=w; main() osoba O1, O2; char na[25], im[20]; int wi; cout<<"podaj dane osoby nr 1:"<<endl; cout<<"nazwisko: "; cin.getline(na,sizeof(na)); cout<<"imię: "; cin.getline(im,sizeof(im)); cout<<"wiek: "; cin>>wi; O1.wczytaj(na,im,wi); O2.wczytaj("Kowalski","Jan",24); cout<<"\nwyświetlenie danych wszystkich osób:"<<endl; O1.wypisz(); O2.wypisz(); return 0; Zauważ, że w zdefiniowanej klasie osoba pola są w sekcji private, natomiast metody są publiczne. Dostęp do pól mają więc tylko funkcje składowe tej klasy i właśnie nimi należy się posługiwać, aby korzystać z pól. Metoda wypisz() została zdefiniowana wewnątrz definicji klasy. Funkcja ta wyświetla na ekranie wartości wszystkich pól. W praktyce wygodniej jest stworzyć dla każdego pola oddzielną metodę. Funkcję składową wczytaj() zadeklarowano w klasie, natomiast jej definicja została umieszczona poza klasą. Spowodowało to konieczność zastosowania operatora zasięgu ::, który wykorzystywany jest do podania nazwy klasy. W praktyce częściej stosuje się definiowanie metod poza klasą, ponieważ zapis jest czytelniejszy. Działanie metody wczytaj() polega na przypisaniu polom nowych wartości podanych w tej funkcji jako parametry. Tutaj również bardziej przydatne okazuje się przydzielenie każdemu polu oddzielnej metody. W programie utworzono dwa obiekty: O1 i O2. Wartości pól obiektu O1 wprowadzane są z klawiatury, natomiast obiektu O2 bezpośrednio w programie. 289

Rozdział 3. Programowanie w języku C++ 3.9.2 Konstruktory i destruktory Konstruktor jest specjalną metodą, uruchamianą automatycznie przy tworzeniu obiektu danej klasy. Zadaniem konstruktora jest zainicjowanie pól obiektu danej klasy, czyli przypisanie im wartości początkowych, przydzielenie pamięci czy wykonanie innych czynności niezbędnych do prawidłowego utworzenia obiektu. Nazwa konstruktora musi być taka sama jak nazwa zawierającej go klasy. Funkcja konstruktora nie ma określanego typu, nie można więc przypisywać jej żadnej wartości. Konstruktor nie jest obowiązkowym elementem definicji klasy. Jeżeli nie zostanie on zdefiniowany, kompilator automatycznie wygeneruje konstruktor domyślny. W praktyce jednak każda klasa powinna zawierać funkcję konstruktora. W danej klasie można zdefiniować więcej niż jeden konstruktor, wykorzystując mechanizm przeładowania funkcji (patrz punkt 3.5.4, Przeładowanie funkcji"). Przykład 3.56 Poniżej przedstawiono definicję klasy analizowanej w przykładzie 3.55 z dodanymi deklaracjami dwóch konstruktorów (prog3_44.cpp). class osoba char nazwisko[25]; char imie[20]; int wiek; osoba(); //deklaracja konstruktora 1 osoba(char *n, char *i, int w); //deklaracja konstruktora 2 void wczytaj(char *n, char *i, int w); void wypisz(); ; Definicje tych konstruktorów mogą być następujące: osoba::osoba () //definicja konstruktora 1 strcpy(nazwisko,""); strcpy(imie,""); wiek=0; osoba::osoba (char *n, char *i, int w) //definicja konstruktora 2 strcpy(nazwisko,n); strcpy(imie,i); wiek=w; 290

3.9 Programowanie obiektowe Różnią się one parametrami i to właśnie one decydują o wyborze właściwego konstruktora przy tworzeniu obiektu klasy: osoba O1; //uruchomienie konstruktora 1 osoba O2("Kowalski","Jan",24); //uruchomienie konstruktora 2 Destruktor jest specjalną funkcją składową wywoływaną w chwili likwidacji obiektu danej klasy. Metoda ta jest funkcją bezparametrową i nie zwracającą żadnej wartości. Nazwa destruktora składa się z nazwy klasy poprzedzonej znakiem ~. Do zadań destruktora należy zwalnianie zasobów wykorzystywanych przez obiekt i inne czynności porządkowe. Funkcja ta jest uruchamiana automatycznie przy usuwaniu obiektu danej klasy. Destruktor nie jest obowiązkowym elementem klasy. Nie wolno przeciążać funkcji destruktora, można go zdefiniować tylko raz. Przykład 3.57 Przeanalizujmy fragment programu (prog3_45.cpp) podany poniżej. Przedstawiony przykład klasy pokazuje zastosowanie destruktora. Wykorzystano tutaj definicję klasy z przykładów 3.55 i 3.56. Aby działanie destruktora było zauważalne, wprowadzono dodatkowo dynamiczny przydział pamięci dla tworzonych obiektów. class osoba char nazwisko[25]; char imie[20]; int wiek; osoba(char *n, char *i, int w); ~osoba(); //deklaracja destruktora void wypisz(); ; Definicja destruktora w najprostszej postaci wygląda następująco: osoba::~osoba () //definicja destruktora W programie konstruktor uruchamiany jest wraz z operatorem new, natomiast destruktor przy wykonywaniu operacji delete. W przypadku obiektów dynamicznych odwołanie do składników klasy wymaga operatora >. 291

Rozdział 3. Programowanie w języku C++ main() osoba *wsk; wsk = new osoba("kowalski","jan",24); wsk >wypisz(); delete wsk; //uruchomienie destruktora return 0; //uruchomienie konstruktora Zadanie 3.48 Napisz program, w którym zostanie zdefiniowana klasa przedmiot zawierająca następujące elementy: pola: nazwa, typ, producent, rok_produkcji; metody: wczytaj(), wypisz(), dwa konstruktory. Utwórz dwa obiekty klasy przedmiot: P1 i P2. Program powinien realizować wczytywanie danych do pól i wypisywanie ich wartości na ekranie. Zastosuj następujący dostęp do składowych klasy: pola prywatne, metody publiczne. Zadanie 3.49 Napisz program, w którym zostanie zdefiniowana klasa ksiazka zawierająca następujące elementy: pola: tytul, autor, wydawnictwo, rok_wydania, cena; metody: wczytajtytul(), wczytajautora(), wczytajwydawnictwo(), wczytajrokwydania(), wczytajcene(), wypisztytul(), wypiszautora(), wypiszwydawnictwo(), wypiszrokwydania(), wypiszcene(), dwa konstruktory, destruktor. Utwórz dwa obiekty klasy ksiazka: K1 i K2, dla których zastosuj dynamiczny przydział pamięci. Program powinien wczytywać dane do pól i wypisywać ich wartości na ekranie. Zastosuj następujący dostęp do składowych klasy: pola prywatne, metody publiczne. 292

3.9 Programowanie obiektowe 3.9.3 Dziedziczenie i hierarchia klas Dziedziczenie polega na ustanowieniu związku pomiędzy dwoma klasami, z których jedna jest klasą bazową, a druga klasą pochodną, czyli dziedziczącą. Po zdefiniowaniu takiej relacji klasa pochodna jest rozszerzana o wskazane składowe odziedziczone z klasy bazowej (czyli pola i metody). Obiekty klasy pochodnej zawierają więc składowe specyficzne dla tej klasy (zawarte w definicji klasy pochodnej) oraz pola i metody odziedziczone z klasy bazowej (określone w definicji klasy bazowej). Klasa pochodna może dziedziczyć z więcej niż jednej klasy bazowej. Związek klasy pochodnej z jedną klasą bazową nazywamy dziedziczeniem pojedynczym. Jeśli jednak klasa pochodna jest związana z wieloma klasami bazowymi, mamy do czynienia z dziedziczeniem wielokrotnym. Wówczas w obiekcie klasy pochodnej występują, poza polami i metodami tej klasy, składowe odziedziczone ze wszystkich klas bazowych. Mechanizm ten umożliwia wiązanie ze sobą niezależnych od siebie typów klas. Dziedziczenie może odbywać się pośrednio lub bezpośrednio. Dziedziczenie bezpośrednie występuje, gdy przodek danego obiektu jest zdefiniowany jako niezależny typ obiektowy (czyli nie dziedziczy z żadnej klasy). Jeśli jednak przodek sam dziedziczy elementy pewnego typu obiektowego, mówimy o dziedziczeniu pośrednim, ponieważ jego potomek dziedziczy pośrednio także elementy tego typu. Cecha ta pozwala na tworzenie hierarchii klas, która określa relacje pomiędzy poszczególnymi klasami. Tryb dziedziczenia wskazywany jest za pomocą słów kluczowych public, protected lub private. Przy dziedziczeniu publicznym, określanym za pomocą słowa kluczowego składowe dziedziczone z sekcji public klasy bazowej dołączane są do sekcji publicznej klasy pochodnej; składowe dziedziczone z sekcji protected klasy bazowej dołączane są do sekcji protected klasy pochodnej. Przy dziedziczeniu chronionym, wskazywanym za pomocą słowa kluczowego protected, składowe dziedziczone zarówno z sekcji public, jak i z sekcji protected są dołączane do sekcji protected klasy pochodnej. Przy dziedziczeniu prywatnym, określanym za pomocą słowa kluczowego private, składowe dziedziczone zarówno z sekcji public, jak i z sekcji protected klasy bazowej są dołączane do sekcji private klasy pochodnej. Składowe sekcji private klasy bazowej w każdym wypadku są niedostępne dla klasy pochodnej. 293

Rozdział 3. Programowanie w języku C++ Przykład 3.58 Przyjrzyj się przykładom hierarchii klas przedstawionym na rysunkach 3.17 i 3.18. Dokładnie przeanalizuj ich strukturę. INSTRUMENT DĘTY STRUNOWY DREWNIANY BLASZANY SMYCZKOWY FAGOT PUZON TRĄBKA Rysunek 3.17. Przykładowa hierarchia klas z dziedziczeniem pojedynczym W przedstawionej na rysunku 3.17 hierarchii klas występuje tylko dziedziczenie pojedyncze. Niezależną klasą bazową jest klasa INSTRUMENT. Występuje tutaj dziedziczenie bezpośrednie i pośrednie. Na przykład klasa SMYCZKOWY dziedziczy bezpośrednio z klasy STRUNOWY i pośrednio z klasy INSTRUMENT. ŁÓDŹ SAMOCHÓD Rysunek 3.18. Przykładowa hierarchia klas z dziedziczeniem wielokrotnym AMFIBIA W kolejnej pokazanej na rysunku 3.18 hierarchii klas występuje dziedziczenie wielokrotne. Klasa AMFIBIA dziedziczy bezpośrednio z dwóch klas: ŁÓDŹ i SAMOCHÓD. Amfibia, będąc pojazdem wodno-lądowym, może pełnić funkcję zarówno łodzi, jak i samochodu. Posiada więc cechy charakterystyczne dla obydwu wskazanych pojazdów. 294

3.9 Programowanie obiektowe Przykład 3.59 Podane poniżej definicje klas tworzą hierarchię przedstawioną na rysunku 3.19. osoba Rysunek 3.19. Hierarchia klas do przykładu 3.59 nauczyciel uczen absolwent Istnieje w tym przypadku możliwość tworzenia obiektów różnych klas. Mało prawdopodobne jest jednak, że zaistnieje potrzeba stworzenia obiektu klasy osoba. O klasie tej możemy więc powiedzieć, że jest klasą abstrakcyjną. class osoba char nazwisko[30]; char imie[20]; int wiek; osoba(char *n, char *i, int w); ~osoba(); char *wypisznazwisko(); char *wypiszimie(); int wypiszwiek(); void wczytajnazwisko(char *n); void wczytajimie(char *i); void wczytajwiek(int w); ; class nauczyciel : public osoba int staz; char przedmiot[25]; nauczyciel(char *n, char *i, int w, int s, char *p); ~nauczyciel(); 295

Rozdział 3. Programowanie w języku C++ int wypiszstaz(); char *wypiszprzedmiot(); void wczytajstaz(int s); void wczytajprzedmiot(char *p); ; class uczen : public osoba double srednia_ocen; int rok_rozpoczecia; uczen(char *n, char *i, int w, double s, int rr); ~uczen(); double wypiszsredniaocen(); int wypiszrokrozpoczecia(); void wczytajsredniaocen(double s); void wczytajrokrozpoczecia(int rr); ; class absolwent : public uczen int rok_zakonczenia; absolwent(char *n, char *i, int w, double s, int rr, int rz); ~absolwent(); int wypiszrokzakonczenia(); void wczytajrokzakonczenia(int z); ; Konstruktor klasy pochodnej powinien obejmować pola własnej klasy oraz pola odziedziczone. Przykładem takiej funkcji jest przedstawiony poniżej konstruktor klasy uczen, który odziedziczone pola wczytuje poprzez konstruktor klasy poprzedniej w hierarchii, czyli bazowej: uczen::uczen(char *n, char *i, int w, double s, int rr): osoba(n,i,w) srednia_ocen = s; rok_rozpoczecia = rr; Metody wczytujące i wypisujące wartości pól zawarte w klasie uczen mogą mieć następującą postać: double uczen::wypiszsredniaocen() return srednia_ocen; void uczen::wczytajrokrozpoczecia(int rr) rok_rozpoczecia = rr; 296

3.9 Programowanie obiektowe Zadanie 3.50 Napisz program zawierający hierarchię klas przedstawioną w przykładzie 3.59. Zdefiniuj obiekty klas uczen, absolwent i nauczyciel. Zastosuj dynamiczny przydział pamięci. 3.9.4 Polimorfizm i metody wirtualne Pola i metody typu obiektowego dziedziczone są w typach potomnych. Metody typu poprzedniego mogą być zastępowane w typie potomnym nowymi metodami o tej samej nazwie, co nazywamy pokrywaniem metody dziedziczonej po przodku. Polimorfizm (czyli wielopostaciowość) polega na zdefiniowaniu metody o jednej nazwie w całej hierarchii klas. Wynika stąd, że w każdej klasie pojawi się metoda o tej samej nazwie. W języku C++ polimorfizm jest realizowany za pomocą metod wirtualnych, a obiekty z deklaracjami takich metod nazywamy obiektami polimorficznymi. Deklaracja pewnej metody jako wirtualnej w definicji typu obiektowego następuje przez dodanie na początku słowa kluczowego virtual. Jeśli jakaś metoda jest zadeklarowana w typie poprzednim jako wirtualna, to wszystkie metody o takim samym identyfikatorze w typach potomnych muszą być także zadeklarowane jako wirtualne. W praktyce wystarczy deklaracja metody wirtualnej w klasie bazowej. Przykład 3.60 Przeanalizuj kod programu przedstawiony poniżej (prog3_46.cpp). Określ zdefiniowaną hierarchię klas. Wskaż metody wirtualne zastosowane w tym programie. Uzasadnij potrzebę ich wykorzystania w tym przypadku. #include <iostream> using namespace std; class pierwsza protected: int a; int b; pierwsza(int a, int b); ~pierwsza(); virtual void oblicz1(); virtual void oblicz2(); int oblicz(); int wypisza(); int wypiszb(); ; 297

Rozdział 3. Programowanie w języku C++ class druga: public pierwsza int c; druga(int a, int b, int c); ~druga(); void oblicz1(); void oblicz2(); int wypiszc(); ; pierwsza::pierwsza(int aa, int bb): a(aa), b(bb) pierwsza::~pierwsza() void pierwsza::oblicz1() a*=2; void pierwsza::oblicz2() b*=2; int pierwsza::oblicz() oblicz1(); oblicz2(); return a+b; druga::druga(int aa, int bb, int cc=3): pierwsza(aa, bb), c(cc) druga::~druga() void druga::oblicz1() a*=c; void druga::oblicz2() b*=c; int pierwsza::wypisza() return a; int pierwsza::wypiszb() return b; 298

3.9 Programowanie obiektowe int druga::wypiszc() return c; main() pierwsza *P = new pierwsza(2,3); druga *D; D = new druga(3,4); cout<<"klasa PIERWSZA"<<endl; cout<<"a="<<p->wypisza()<<"\nb="<<p >wypiszb()<<endl; >wypiszb()<<endl; cout<<"wynik="<<p->oblicz()<<endl; cout<<"\nklasa DRUGA"<<endl; cout<<"a="<<d->wypisza()<<"\nb="<<d >wypiszb()<<"\nc=" >wypiszb()<<"\nc=" <<D->wypiszC()<<endl; cout<<"wynik="<<d->oblicz()<<endl; delete P; delete D; return 0; Po wykonaniu programu zostaną wypisane następujące komunikaty: klasa PIERWSZA a=2 b=3 wynik=10 klasa DRUGA a=3 b=4 c=3 wynik=21 Zadanie 3.51 W pliku prog3_47.cpp znajduje się fragment programu zawierający hierarchię klas przedstawioną na rysunku 3.20. 299

Rozdział 3. Programowanie w języku C++ s k le p Rysunek 3.20. Hierarchia klas do zadania 3.51 t o w a r p r a c o w n ik Uzupełnij kod tego programu, dodając podane elementy: a) Zdefiniuj klasę pracownik składającą się z następujących elementów: pola: stanowisko stanowisko zajmowane przez pracownika, zasadnicze miesięczne wynagrodzenie zasadnicze jednego pracownika, premia miesięczna premia jednego pracownika; metody realizujące następujące działania: wczytywanie wartości pól; wypisanie wartości pól; wypisanie nazwy i miesięcznych obrotów sklepu, jeśli liczba pracowników jest nie większa niż 5 i miesięczne obroty przekraczają 50 000 zł; obliczenie całkowitego wynagrodzenia wszystkich pracowników z uwzględnieniem wynagrodzenia zasadniczego i premii. b) Uzupełnij klasy towar i sklep, dodając do każdej z klas po jednej samodzielnie zdefiniowanej metodzie wykonującej operacje na polach. c) Utwórz obiekt T klasy towar i obiekt P klasy pracownik. W programie należy zastosować dynamiczne odwołanie do obiektów i następujący dostęp do składowych klas: pola prywatne, metody publiczne. 300