Jzyk C++ cz 5 dziedziczenie Jarosław Gramacki Instytut Informatyki i Elektroniki " ###$ % #% & ' ( ) * #% +% %, %-##. %-*+ + +# ) + #### # '/01,%*1 % ##.-'# 2 % + -+#+( ) ###%# #3/ 0 %+!% 0' '// * #! ) %+ ####..'' * #'%! ) '/% 4* %+'#%. * #' ) # %+'# %-* * #'! 2
" ###$%# -%#*'%, # #/# '/% 5 ##,-( 6%, # % 0 3 #nazwisko!% %'biuro! -% %#* 7 % %'% '.3% * # +%'4*38# # 9#%,! : 5# ## '% -% +-%-*( ; % '/ 6% % %'!- 0#*%#% + /,#godziny! #,# stawka! <%# 6% - 0 '%'#'' # #*,#) ' %#;!= #% %procent!# # ' /%# sprzedaz! >#6% - 0 '%'pensja!=% premia!# #* %,+% -ile_pracowników!,(%' % > ' #,-#,# %-' %#% ; -<%# - # +'! 3 " ###$#/# # ) 7 0%+ +%#,%, # '/( %# / 0#% #/0#+ % -#% nazwisko biuro## '%# '/ 3# #.).3 '% # 3',?%# / 0###//% # '// % '%% % '/, @%# /'0!-'# 0#% +'! 4
" ###$#/# # class ( const char* _nazwisko, short _biuro = 0 ); ~() delete [] nazwisko; void print() const; void set_biuro( short _biuro ) biuro = _biuro; const char* get_telefon() const; private: char* nazwisko; short biuro; ; %- ',# A #/' ::( const char* _nazwisko, short _biuro) : biuro( _biuro ) nazwisko = new char [ strlen( _nazwisko) + 1 ]; strcpy( nazwisko, _nazwisko ); lista inicjalizacyjna nie jest ograniczona jedynie do pól const (patrz poprzedni wykład)! 5 " ###$#/# # void ::print() const cout << " " << nazwisko << " :" << endl; cout << "biuro = " << biuro << ", " << "tel. = " << get_telefon() << endl; const char* ::get_telefon() const static const char* tel[] = "0000", "1111", "2222", "3333", "4444"; // symulacja uzyskiwania numeru telefonu return tel[ biuro ];! 6
" ###$#/# # % ' ###%*# '#0.'!>###% +'B0# %-C' class : public ( const char* _nazwisko, int _biuro = 0, float _stawka = 0.0, float _godziny = 0.0 ); void print() const; void set_stawka( float _stawka ) stawka = _stawka; void set_godziny( float _godziny ) godziny = _godziny; float oblicz_place() const; private: float stawka; float godziny; ;! 7 " ###$#/# # ::( const char* _nazwisko, int _biuro, float _stawka, float _godziny ) : ( _nazwisko, _biuro ), stawka( _stawka ), godziny( _godziny ) # #! ' void ::print() const ' % ' # #0' ::print(); cout << "Stawka godzinowa = " << stawka << ", " << "Liczba przepracowanych godzin = " << godziny << endl; float ::oblicz_place() const return stawka * godziny;! 8
" ###$#/# # void main() p1( "Kowalski", 2 ); p1.print(); p1.set_biuro( 5 ); p1.print(); // ::print() // ::set_biuro() // ::print() e1( "Malinowski", 3, 70.0, 169.0 ); e1.print(); // ::print() e1.set_biuro( 4 ); // ::set_biuro() // 3 -> 4 e1.set_stawka( 75.0 ); // ::set_stawka() // 70.0 -> 75.0 e1.print(); // ::print()! 9 " ###$ # #/# ) '/ % stawka, godziny! set_stawka(), set_godziny(), oblicz_place()!#% % %% % % ' * ) print() # 0%'0print()# ) # ::print() # # ::print()! 10
" ###$ # #/# ) * %+' 0%#+-%*#+ '' * #'#,*0/# #'%! e1( "Kowalski", 3, 70.0, 169.0 ); e1.print(); // ::print() e1.set_biuro( 4 ); // ::set_biuro() ) %+ # 3#-% + '' * #' &1# 301#./'%*#'#'D! void ::print() const // ::print(); tak jest teraz... // a tak bdzie le... // BLAD: ::nazwisko jest w sekcji private cout << "" << nazwisko << " :",, endl;! 11 " ###$ # #/# ) # ::print(),print() %'# %00 %, E% # ::'0#*0 F ' # +#, %+ ' 0# * #' void ::print() const ::print(); // OK print(); // BLAD, wywołujemy ::print();! 12
" ###$ # #/# ) '. * # ' # 3 # # * %+'%% # ' #'/0 -*###! ) 0# %+'.3 * #'%# #'/ %! ::( const char* _nazwisko, int _biuro, float _stawka, float _godziny ) : ( _nazwisko, _biuro ), stawka( _stawka ), godziny( _godziny ) * #' ' # ' # *! B#, # '!. * #'D ' # ' % # A! ' # ' %# +%-! 13 " %# %# class : public ( const char* _nazwisko, short _biuro = 0, float _pensja = 0.0, float _premia = 0.0, int _ile_pracownikow = 0); void print() const; void set_pensja( float _pensja ) pensja = _pensja; void set_premia( float _premia ) premia = _premia; void set_ile_pracownikow( int _ile_pracownikow ) ile_pracownikow = _ile_pracownikow; float oblicz_place() const; private: float pensja; float premia; int ile_pracownikow; ; :: ( const char* _nazwisko, short _biuro, float _pensja, float _premia, int _ile_pracownikow ) : ( _nazwisko, _biuro ), pensja( _pensja ), premia( _premia ), ile_pracownikow( _ile_pracownikow )! 14
" %# %# void ::print() const ::print(); cout << "pensja = " << pensja << ", " << "premia = " << premia << endl; cout << "Liczba nadzorowanych pracownikow = " << ile_pracownikow << endl; float ::oblicz_place() const return pensja + premia;! 15 " %# %# class : public ( const char* _nazwisko, short _biuro = 0, float _stawka = 0.0, float _godziny = 0.0, float _procent = 0.0, float _sprzedaz = 0.0 ); void print() const; void set_procent( float _procent ) procent = _procent; void set_sprzedaz( float _sprzedaz ) sprzedaz = _sprzedaz; float oblicz_place() const; private: float procent; float sprzedaz; ; ::( const char* _nazwisko, short _biuro, float _stawka, float _godziny, float _procent, float _sprzedaz ) : ( _nazwisko, _biuro, _stawka, _godziny ), procent( _procent ), sprzedaz( _sprzedaz ) void ::print() const ::print(); cout << "procent = " << procent << ", " << "od sprzedazy = " << sprzedaz << endl; float ::oblicz_place() const return ::oblicz_place() + procent * sprzedaz;! 16
" %,,- void main() s1( "Kowalski" ); <%# *#%.0% '::set_biuro() set_biuro() # %# s1.set_biuro( 1 ); // ::set_biuro() s1.set_stawka( 90.0 ); // ::set_stawka() s1.set_godziny( 169.0 ); // ::set_godziny() s1.set_procent(.05 ); // ::set_procent() s1.set_sprzedaz( 10000.0 ); // ::set_sprzedaz() s1.print(); // ::print() cout << "Placa = " << s1.oblicz_place() << endl; d1( "Malinowski" ); d1.set_biuro( 2 ); // ::set_biuro() d1.set_pensja( 15000.0 ); // ::set_pensja() d1.set_premia( 1500.0 ); // ::set_premia() d1.set_ile_pracownikow( 25 ); // ::set_ile_pracownikow() d1.print(); // ::print() cout << "Placa = " << d1.oblicz_place() << endl;! 17 " ###$ * #, %! 18
" ' *-+ + ) % %##,-+ ( - nazwisko, biuro - nazwisko, biuro, stawka, godziny ) '/*#%.,0%%-% + -###/# ) *%% ' %#+'% 0 ) 03%-*'*% *% (' * %+' * * #'! void main() p1 ( "Malinowski" ); e1 ( "Kowalski", 2, 75.0, 169.0 ); e1.print(); p1 = e1; // OK : Konwersja ->. p1.print(); // to samo osigniemy gdy napiszemy: e1.::print(); 6# %, ( Kowalski Biuro = 2, tel. = 2222 Stawka godzinowa = 75, Liczba przepr. godzin = 169 % Kowalski Biuro = 2, tel. = 2222! 19 " ' *-+ + ) % %##,-+ ( - nazwisko, biuro - nazwisko, biuro, stawka, godziny ) ' %, % %-*p1 %+%-*e1 ) 0' /'0* %+' * * #' ) # '!' %# 0' void main() e1( "Kowalski", 2, 75.0, 169.0 ); p1( "Malinowski" ); e1.print(); p1 = e1; // OK : Konwersja ->. e1 = p1; // BLAD : Konwersja -> jest niemoliwa p1.print(); 2' * # $$G %+ %# *%% ' 3 +%- + %+'! 20 %
" ' C-*-+ + ) %*,/ ' %#' C- *- ) C* %+'%, #'' C * * #' ) *0 '/7#. ' #- '' void main() s( "Wincenty", 2, 75.0, 169.0, 0.05, 10000 ); * ptr_s = &s; * ptr_e = ptr_s; // OK : konwersja (*) -> (*) * ptr_p = ptr_s; // OK : konwersja (*) -> (*) ptr_s->set_biuro( 3 ); // OK : ::set_biuro() ptr_e->set_biuro( 4 ); // OK : ::set_biuro() ptr_p->set_biuro( 5 ); // OK : ::set_biuro() %H% %H ptr_s->set_stawka( 85.0 ); // OK : ::set_stawka() ptr_e->set_stawka( 95.0 ); // OK : ::set_stawka() ptr_p->set_stawka( 98.0 ); // BLAD: nie istnieje ::set_stawka() %H ptr_s->set_sprzedaz( 15000 ); // OK : ::set_sprzedaz() ptr_e->set_sprzedaz( 20000 ); // BLAD: nie istnieje ::set_sprzedaz() ptr_p->set_sprzedaz( 30000 ); // BLAD: nie istnieje ::set_sprzedaz()! 21 " ' C-*-+ + ) ',/0' C * * #' #0'! C* %+'!, ',% %, ' 7' #! void main() s( "Wincenty", 2, 75.0, 169.0, 0.05, 1000 ); * ptr_e = &s; // OK : konwersja (*) -> (*) p( "Jan", 3, 70.0, 169.0); * ptr_s = &p; // BLAD: nie jest wykonywana automatyczna konwersja (*)->(*) ptr_s -> sprzedaz = 2000; // BLAD: ptr_s wskazuje na p, ktory nie zawiera pola "sprzedaz" ptr_s = (*) ptr_e; // OK: jawna konwersja ptr_s -> sprzedaz = 2000; // OK %H! 22 %H
" '!% ) '% * public private6### '- protected ) % # 'protected # +'/0' % % ' '%+'!#'/0%+ %-' **%*# ) +# / %#'- %+'#* +'*0/ ' # %#' C# / ) /, I protected%# * % '* %, #0#, '%++ ) 3protected I J #' + /+% 0+ + %++! 23 " '!% ) (+ % ' # private. ;# # *#%# %0# public private )?+* '#!(% ' * #'#3#* # %+-*#%.# '/#''%-protected! 24
" '!% class Bazowa void f(); int publ; protected: int prot; private: int priv; ; void Bazowa::f() publ = 1; // OK : komponent publiczny prot = 2; // OK : f() to funkcja skladowa klasy Bazowa priv = 3; // OK : f() to funkcja skladowa klasy Bazowa class Pochodna : public Bazowa void g(); ; void Pochodna::g() publ = 1; // OK : komponent publiczny prot = 2; // OK : dozwolony dostep do komponentu protected priv = 3; // BLAD: niedozwolony dostep do komponentu private. E20%%##'0 * #' E20%%##'0 %+' void main() Bazowa b; b.publ = 1; // OK : komponent publiczny b.prot = 2; // BLAD: niedozwolony dostep do komponentu protected poprzez obiekt typu Bazowa b.priv = 3; // BLAD: niedozwolony dostep do komponentu private. Pochodna d; B/0%*#%.# %##'0 * #'* %+' d.publ = 1; // OK : komponent publiczny d.prot = 2; // BLAD: niedozwolony dostep do komponentu protected poprzez obiekt typu Pochodna d.priv = 3; // BLAD: niedozwolony dostep do komponentu private.! 25 " ####, #! 26
" ###% %! ) '% '/+ #### ##. public %# # * #' ) ###' '#0.'! ) ###public #%public protected * #' /0% '' %+' %private / ) '/%#%, # + + +!' %% # 0% '#! class Bazowa void f(); int a, b; private: float c, d; ; class Pochodna : public Bazowa void g(); ; void main() Pochodna d; d.a = 1; d.b = 2; d.f(); Bazowa Pochodna public 2%%*# Bazowa%# '/%*# Pochodna ;, #0#% *#%.%# # 3# %. *#,% 0 Pochodna // dostp do elementów publicznych klasy bazowej! 27 " ###% %! ) ###private0% %K# *#%# ) ###private%# %#'' 30%.3%- * #'#%# %+' ) ###private #% * #'# +'/0 ' %private %+' ) % * #'/00%/## %/' + %+'*#%.0%'0$ +#! class Bazowa void f1(); void f2(); int a, b; private: float c, d; ; Bazowa Pochodna private class Pochodna : private Bazowa Bazowa::f1(); // jawna autoryzacja dostpu do wybranych Bazowa::a; // komponentów klasy Bazowa (robimy to w sekcji public!) ; void main() Pochodna d; d.a = 1; // OK d.b = 2; // BŁAD d.f1(); // OK d.f2(); // BŁD B *#%.,0% %- * #' & 0# # 30% * +%- * #'! 28
" ###+%! ) ###protected#%public protected * #'# +'/0' %protected %+'/ 0% %, #0#,! ) % #' %+'#'/ 0%# - '' +' ' + class Pochodna : protected Bazowa... Bazowa Pochodna protected #'( %, #0#4* # ' %+' '/0%'''' L#'' #0#*0III! 29 " ###+%! ) ### private class Pochodna : Bazowa // UWAGA! domylnie bdzie dziedziczenie private... ; void main() Pochodna d; d.a = 1; // BŁAD d.b = 2; // BŁAD j.w d.f1(); // BŁAD j.w. d.f2(); // BŁD j.w. %'' %#public *0# 'D!private próba dostpu do komponentu private! 30
" '###public, private, protected, # K# ) %- ' ## 'C,%0# #.' #, ( ) ' $ '% %*% ) %*### $% %*% ) ' #'%#% D! 31 " ### ) # '# ###/'+ ) + $# #/# %./% -+ #! $ #'%' #%0#.%# + #! ) *%Handlowy 0%%-%*#+! Handlowy! 32
" ### class Handlowy : public, public Handlowy( const char* _nazwisko ); //... ewentualnie pozostale funkcje ; Handlowy::Handlowy( const char* _nazwisko ) : ( _nazwisko ), ( _nazwisko ) void main() Handlowy jk( "Jan Kowalski" ); Handlowy jk.set_pensja( 15000.0 ); // ::set_pensja() jk.set_premia( 2000.0 ); // ::set_premia() jk.set_ile_pracownikow( 5 ); // ::set_ile_pracownikow() jk.set_procent( 0.001 ); // ::set_procent() jk.set_sprzedaz( 500000.0 ); // ::set_sprzedaz()! 33 " ###%* ) ###'' % *0 ) ' #%./ * #/ Handlowy ) *%Handlowy % 0 %%- /+ void main() Handlowy jk( "Jan Kowalski" ); jk.set_pensja( 15000.0 ); jk.set_premia( 2000.0 ); jk.set_ile_pracownikow( 5 ); jk.set_procent( 0.001 ); jk.set_sprzedaz( 500000.0 ); // ::set_pensja() // ::set_premia() // ::set_ile_pracownikow() // ::set_procent() // ::set_sprzedaz() jk.set_biuro( 2 ); // BLAD : instrukcja niejednoznaczna cout << jk.get_telefon() << endl; // BLAD : instrukcja niejednoznaczna jk.::set_biuro( 2 ); // OK. cout << jk.::get_telefon() << endl; // OK. jk.print(); // BLAD: ::print() czy ::print()? % # +3'*/%'. #+ '*jk '#0. '#.,#* ::print() #::print()! 34
" ###%* ) %*%#' ) %# #%''' %+' * #' * pp = &jk; // BLAD : instrukcja niejednoznaczna // wskazujemy dan gał dziedziczenia * pp = (*) &jk ; 7 -/#%%- ; # 3 C%%I Handlowy! 35 " ###$ * # ) *%Handlowy% # %-###+# # *!7'#.#,# ##./ ) virtual%## %++*#%. /,.3 ) virtual %# % %- -',! ) ''# #% # #.'/ #E2 class : public virtual... ; class : public virtual... ; virtual %#+ % #+# Handlowy! 36
" ###$ * # ) %#### ##+ % ' 3 '' ' * #','''*#%.%! class : public virtual... ; class : public virtual... ; class Handlowy : public, public Handlowy( const char* _nazwisko ); void print() const ; ::print(); ::print();... Handlowy 6 Handlowy::print() %'. '%+#/+# ::print(). M*#3 *# 3# 'print() '+ +!!! Handlowy::Handlowy( const char* _nazwisko ) : ( _nazwisko ), ( _nazwisko ), ( _nazwisko ),*%%#! 37 " ###, ) ###'% *0 ), %', 3%#% +###,'#! ) %'/ 0Handlowy ''%#%3# ###3!,%'/,# %' % %# '.%#! 38