Prejdi na obsah

C++ triedy pokračovanie

V predchádzajúcej časti seriálu sme sa venovali triedam. Dnes v tom budeme pokračovať. Pozrieme sa pokročilejšiu techniku, ktorej sa hovorí dedičnosť. Dnes sa pozrieme iba na základnú, takzvanú verejnú dedičnosť, pomocou kľúčového slova public.

Začneme jednoduchou otázkou. Kto/čo je to robotník a riaditeľ. Čo majú spoločne a čo odlišne. Robotník, je nejaký zamestnanec, zamestnanec je nejaký človek, človek je nejaký cicavec a tak by sme mohli isť ďalej. Riaditeľ je v podstate tiež nejaký zamestnanec (človek, cicavec...). Čiže ma určite vlastnosti rovnaké ako robotník, ibaže môže riadiť, prideľovať mzdy, rozhodovať...

A pravé tento vzťah súvislosti vyjadruje dedičnosť. Zameriame sa iba na tri triedy. Zamestnanec, robotník a riaditeľ. „Naučíme“ zamestnanca chodiť do roboty, poberať plat, chodiť na obedy... Toto všetko robí ako robotník tak aj riaditeľ. Preto už stačí robotníka „naučiť“ iba napríklad pracovať pri páse a povedať mu, že je zamestnanec. To isté riaditeľa stačí naučiť iba rozhodovať a povedať mu, že je zamestnanec.

Dedičnosť

Zápis dedičnosti vyzerá:

  1. Class robotnik : public zamestnanec
  2. {//funkcie triedy robotník
  3. };

V tomto prípade predpokladáme, že triedu zamestnanec už máme definovanú. Zatiaľ, budeme stále používať kľúčové slovo public. O ostatných možnostiach dedičnosti si povieme neskôr.

Teraz si toto všetko vyskúšame na nasledujúcom príklade (viem, že je dlhy, ale nie je náročný. Iba presne popisuje ku ktorým funkciám máme z ktorých tried prístup):

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. class zamestnanec //definícia triedy zamestnanec
  7. {public: //pre jednoduchosť uvediem všetky funkcie ako verejne
  8. void ChodDoRoboty();
  9. void ChodNaObed();
  10. void ZoberPlat();
  11. };
  12. class robotnik:public zamestnanec //definujeme triedu robotník, ktorá dedí po triede zamestnanec
  13. {public:
  14. void PracujPriPase();
  15. };
  16. class riaditel:public zamestnanec //definujeme triedu riaditeľ, ktorá dedí po triede zamestnanec
  17. {public:
  18. void Rozhoduj();
  19. };
  20.  
  21. void zamestnanec::ChodDoRoboty()
  22. {cout<<"Idem do roboty\n"; //Pre jednoduchosť taktiež všetky činnosti nahradíme iba slovným výpisom
  23. }
  24.  
  25. void zamestnanec::ChodNaObed()
  26. {cout<<"Idem na obed\n";
  27. }
  28.  
  29. void zamestnanec::ZoberPlat()
  30. {cout<<"Hura vyplata\n";
  31. }
  32.  
  33. void robotnik::PracujPriPase()
  34. {cout<<"Pracujem pri pase\n";
  35. }
  36.  
  37. void riaditel::Rozhoduj()
  38. {cout<<"Rozhodujem\n";
  39. }
  40.  
  41.  
  42. int main(int argc, char *argv[])
  43. { //Vytvorime 3 objekty 3 rôznych tried
  44. zamestnanec Fero;
  45. robotnik Jano;
  46. riaditel Palo;
  47. cout<<"Fero\n";
  48. Fero.ChodDoRoboty();
  49. Fero.ChodNaObed();
  50. Fero.ZoberPlat();
  51. //Fero.PracujPriPase();
  52. //Fero.Rozhoduj();
  53. cout<<"Jano\n";
  54. Jano.ChodDoRoboty();
  55. Jano.ChodNaObed();
  56. Jano.ZoberPlat();
  57. Jano.PracujPriPase();
  58. //Jano.Rozhoduj();
  59. cout<<"Palo\n";
  60. Palo.ChodDoRoboty();
  61. Palo.ChodNaObed();
  62. Palo.ZoberPlat();
  63. //Palo.PracujPriPase();
  64. Palo.Rozhoduj();
  65. system("PAUSE");
  66. return EXIT_SUCCESS;
  67. }

Všimnite si tri triedy, deklarovane v úvode a ich vzájomné prepojenie pomocou dedičnosti. Celý príklad sa točí okolo piatich funkcii. Tri z nich sú deklarovane v triede zamestnanec, jedna v triede riaditeľ a jedna v triede robotník. V úvode funkcie main potom vytvoríme tri objekty daných tried a skúsime, ktoré funkcie sú im prístupne. Funkcie, ktoré nie sú daným objektom prístupné sú v komentároch, inak by kód nešiel skompilovať.

Objektu triedy zamestnanec sú prístupné iba tri funkcie definovane v triede zamestnanec. Objektu triedy robotník je prístupná funkcia definovaná v triede robotník, spolu s troma funkciami z triedy zamestnanec, ktoré táto trieda zdedila. Podobne aj trieda riaditeľ. Podobne by to fungovalo aj s premennými.

Dúfam, že ste vďaka tomuto príkladu pochopili o čom dedičnosť je. V najbližších dieloch sa na dedičnosť pozrieme ešte zopárkrát.

Konštruktory a deštruktory

Možno sa pýtate ako je to s konštruktormi a deštruktormí v prípade dedičnosti. Uvedomte si, že v našom prípade je trieda zamestnanec ako keby základ a trieda robotník potom nadstavba nad ňu. Preto je potrebne najprv vytvoriť a základ a až potom nadstavbu. Pri odstraňovaní objektu treba postupovať zas opačne od triedy robotník k zamestnanec. Nasledujúci príklad, je trochu upravený príklad z úvodu v ktorom vytvoríme objekt triedy robotník vo funkcii Pracuj(). Po skončení tejto funkcie sa objekt dostáva mimo svoj obor platnosti, a preto je odstránený.

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. class zamestnanec //definícia triedy zamestnanec
  7. {public: //pre jednoduchosť uvedieme iba konštruktor a deštruktor
  8. zamestnanec();
  9. ~zamestnanec ();
  10. };
  11.  
  12. class robotnik:public zamestnanec //definujeme triedu robotník, ktorá dedí po triede zamestnanec
  13. {public:
  14. robotnik(); //konštruktor a deštruktor
  15. ~robotnik();
  16. void PracujPriPase();
  17. };
  18.  
  19. zamestnanec::zamestnanec()
  20. {
  21. cout<<"Konstruktor zamestnanec\n";
  22. }
  23. zamestnanec::~zamestnanec()
  24. {
  25. cout<<"Destruktor zamestnanec\n";
  26. }
  27.  
  28. robotnik::robotnik()
  29. {
  30. cout<<"Konstruktor robotnik\n";
  31. }
  32. robotnik::~robotnik()
  33. {
  34. cout<<"Destruktor robotnik\n";
  35. }
  36. void robotnik::PracujPriPase()
  37. {cout<<"Pracujem pri pase\n";
  38. }
  39.  
  40. void Pracuj()
  41. {robotnik Jano;
  42. Jano.PracujPriPase();
  43.  
  44. }
  45.  
  46. int main(int argc, char *argv[])
  47. { Pracuj();
  48. system("PAUSE");
  49. return EXIT_SUCCESS;
  50. }

Myslím, že vďaka výstupu si tento program nevyžaduje ďalší komentár.

Prekrývanie funkcii

V odvodenej triede môžete deklarovať rovnakú funkciu ako v bázovej triede (triede, z ktorej dedíme). Tým docielime to, že keď zavoláme z odvodenej triedy túto, prekrytú, funkciu vykoná sa funkcia z odvodenej triedy a nie z bázovej. Avšak bazovú triedu úplné nestratíme, pretože ju môžeme zavolať zápisom: názov objektu .(bodka) názov bázovej triedy ::(dve dvojbodky) názov funkcie. Všetko si to ešte ukážeme na poslednom príklade v tejto časti. Ide o zjednodušený a upravený príklad z úvodu.

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. class zamestnanec //definicia triedy zamestnanec
  7. {public:
  8. void ChodNaObed();
  9. };
  10.  
  11. class robotnik:public zamestnanec //definujeme triedu robotník, ktorá dedí po triede zamestnanec
  12. {public:
  13. void ChodNaObed();
  14. };
  15.  
  16. void zamestnanec::ChodNaObed()
  17. {
  18. cout<<"Idem na obed\n";
  19. }
  20.  
  21. void robotnik::ChodNaObed()
  22. {
  23. cout<<"Musim robit, nejdem na obed.\n";
  24. }
  25.  
  26. int main(int argc, char *argv[])
  27. { robotnik Jano;
  28. cout<<"Jano.ChodNaObed()\n";
  29. Jano.ChodNaObed();
  30. cout<<"Jano.zamestnanec::ChodNaObed()\n";
  31. Jano.zamestnanec::ChodNaObed();
  32. system("PAUSE");
  33. return EXIT_SUCCESS;
  34. }

Všimnite si rozdielny výstup, podľa toho, ktorú verziu funkcie ChodNaObed() voláme.

To by bolo zatiaľ všetko. V najbližších častiach sa budeme venovať poliam, zreťazeným zoznamom, ukazovateľom a kľúčovým slovám new a delete.

Povedz o článku aj ostatným - www.pridej.cz

mohol

Pali este si mohol do prvej triedy pre chodNaObed pridat podmienku na to ci je zamestnanec v práci a pod :)

Mohol :)

Jasne mohol, mohol by som toho pridať ešte kopu, avšak mojím cielom nebolo popísať plne funkčne funkcie a triedy iba ukazať ako čo funguje. Je samozrejme, že v praxi vyzerá kód omnoho zložitejšie a prepracovanejšie. tento kód by však zbytočne zabral pomaly tri članky a bolo by to zbytočné.

Prihlásenie

Nové komentáre