1 / 19

Počítače a programování 2

Počítače a programování 2. P řednáška 4 3.3.2014 Jiří Šebesta. T ÉMA. Přetížení členských funkcí Dědičnost tříd. Přetížení členských funkcí umožňuje definovat různé parametry funkce pro různé případy jejich použití. Přetížení členských funkcí (1/8).

jonah
Download Presentation

Počítače a programování 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Počítače a programování 2 Přednáška 4 3.3.2014 Jiří Šebesta

  2. TÉMA Přetížení členských funkcí Dědičnost tříd

  3. Přetížení členských funkcí umožňuje definovat různé parametry funkce pro různé případy jejich použití. Přetížení členských funkcí (1/8) • Přetížení členských funkcí definuje základní přístup k mnohotvarosti (polymorfismu) objektového programování Přetížení funkcí lze použít u funkce tak, aby mohla pracovat s různými typy parametrů např. double sin(double) a současně float sin(float) a podobně. Na základě typu parametrů se pak volá příslušná funkce (použito i v C). S výhodou lze přetížení použít u konstruktorů s různým přístupem inicializace – objekt může být inicializován s parametry v konstruktoru nebo například bez parametrů s defaultní inicializací.

  4. Příklad:Doplnění třídy pro popis objektu typu obdélník s využitím jednoduché třídy pro bod z příkladu Ex101o přetížení konstruktoru Přetížení členských funkcí (2/8) Deklarace třídy pro obdélník: 4x proměnná typu int 4x proměnná typu Point classRect//rectangle class { public: Rect (inttop, intleft, intbottom, intright); //initialization with input parameters Rect (); //initialization by default values ~Rect () {} …

  5. Konstruktor pro třídu Rect – inicializace pomocí vstupních int parametrů (stejné jako v hlavičkovém souboru rect.hpp k příkladu Ex101.cpp) Přetížení členských funkcí (3/8) Rect::Rect(inttop, intleft, intbottom, intright) { Top = top; Left = left; Bottom = bottom; Right = right; TopLeft.SetX(left); TopLeft.SetY(top); TopRight.SetX(right); TopRight.SetY(top); BottomLeft.SetX(left); BottomLeft.SetY(bottom); BottomRight.SetX(right); BottomRight.SetY(bottom); }

  6. Konstruktor pro třídu Rect bez inicializace parametrů, soukromé členské proměnné jsou naplněny defaultními hodnotami Přetížení členských funkcí (4/8) Rect::Rect() { Top = 10; Left = 0; Bottom = 0; Right = 10; TopLeft.SetX(left); TopLeft.SetY(top); TopRight.SetX(right); TopRight.SetY(top); BottomLeft.SetX(left); BottomLeft.SetY(bottom); BottomRight.SetX(right); BottomRight.SetY(bottom); } Kompletní deklarace a definice metod třídy umístěna do rect1.hpp

  7. Volání obou typů (přetížených) konstruktorů (defaultní a s inicializací) pro vytvoření objektů typu obdélník Přetížení členských funkcí (5/8) intmain() { //new object with default parameters Rectmy_rect_A; intSA = my_rect_A.GetArea(); std::cout << "Area of my_rect_A: " << SA << "\n"; //new object with user parameters Rectmy_rect_B(10, 5, 0, 25); intSB = my_rect_B.GetArea(); std::cout << "Area of my_rect_B: " << S << "\n"; return0; } Příklad: Ex102.cpp + rect1.hpp

  8. Př. Přetížení metod pro kreslení obdélníku – kreslení obdélníku podle parametrů objektu – kreslení obdélníku s vlastní reinicializací parametrů Přetížení členských funkcí (6/8) #include <iostream> class Rect { public: Rect(int wi, int he); ~Rect(){} //two ways, how to print object rectangle: void PrintRect() const;//with parameters of given object void PrintRect(int wi, int he) const;//with reiniciated parameters private: int W; int H; };

  9. Definice obou metod pro vykreslení obdélníku Přetížení členských funkcí (7/8) void Rect::PrintRect()const//using parameters of object { PrintRect(W, H);//calling print method with parameters } void Rect::PrintRect(int wi,int he)const//using new parameters { for(int i =0; i < he; i++) { for(int j =0; j < wi; j++) { std::cout<<"\xDB";//print character █ } std::cout<<"\n";//print new line } } Tiskne se plný obdélník s danou šířkou a výškou ze znaků █

  10. Generování objektu obdélník s definovanými parametry a jeho následný tisk a tisk obdélníku s reinicializovanými parametry, tyto parametry se neukládají do privátních proměnných objektu W a H Přetížení členských funkcí (8/8) int main() { Rect A(25,5); //new rectangle with initialization std::cout <<"\nrectangle A:\n"; A.PrintRect();//print rectangle with parameters of object std::cout <<"\nrectangle B:\n"; A.PrintRect(40,2);//print rectangle with spec. parameters return0; } Příklad: Ex103.cpp

  11. je vlastnost OOP, která umožňuje vytvářet nové objekty na základě již vytvořených objektů s využitím dědění jak proměnných tak i metod původní třídy, nová metoda se označuje jako odvozená třída • syntaxe: • class derived_class : acces_type basic_class {declaration} • Např. class dog : public mammal { } Dědičnost tříd (1/8)

  12. Př. Ukázka odvození třídy Pes od třídy Savec #include <iostream> using namespace std; enum RASA {ZLATY_RETRIEVER, PUDL, JEZEVCIK, OVCAK, DOBRMAN, LABRADOR }; // deklarace třídy Savec class Savec { public: Savec(); //výchozí konstruktor ~Savec(); //destruktor int VratVek() const; //přístupové metody k privátním void ZadejVek(int); //proměnným Vek a Vaha třídy Savec int VratVahu() const; void ZadejVahu(int); Dědičnost tříd (2/8)

  13. void Promluvit() const; //výkonné metody třídy Savec void Spat() const; protected: int Vek; //privátní proměnné třídy Savec int Vaha; }; // deklarace třídy Pes class Pes : public Savec //přebírají se všechny metody a { //proměnné public a protected public: Pes(); //výchozí konstruktor ~Pes(); //destruktor RASA VratRasu() const; //přidané přístupové metody void ZadejRasu(RASA); VrtetOcasem(); //přidaná výkonná metoda protected: //přidaná nová položka, protože je RASA jehoRasa; //protected, bude děděna dceřinnou }; //třídou odvozenou od třídy Pes Dědičnost tříd (3/8)

  14. SPECIFIKÁTORY PŘÍSTUPU: public (veřejný) – k proměnné je přístup odkudkoli, lze ji měnit např. ve funkci main(): Pes Alik; Alik.Vek = 15; private (soukromý) – k proměnné je přístup jen v rámci objektu dané třídy – pro přístup odjinud je zapotřebí použití přístupových metod protected (chráněný) - proměnná je pro danou třídu privátní avšak může se k ní přistupovat i v objektech odvozených tříd Dědičnost tříd (4/8)

  15. Příklad: Třída Dog odvozená ze třídy Mammal a použití Dědičnost tříd (5/8) #include <iostream> enumBREED{GOLD_RETRIEVER, POODLE,DACHSHUND,SHEEPDOG,SLEUTH, LABRADOR}; classMammal //parent class { public: Mammal(); ~Mammal(); intGetAge()const{returnAge;} voidSetAge(intnew_age) {Age=new_age;} intGetWeight()const {returnWeight;} voidSetWeight(intnew_weight){Weight=new_weight;} voidOutspeak()const{std::cout<<"Voice of mammal.\n";} void Sleep()const{std::cout<<"Psssst. Go to sleep.\n";} protected: intAge; intWeight; };

  16. odvozená třída Dog Dědičnost tříd (6/8) classDog:publicMammal//derived class { public: Dog(); ~Dog(); BREEDGetBreed()const{returnDog_breed;} voidSetBreed(BREEDnew_breed) {Dog_breed=new_breed;} voidWagByTeil()const{std::cout<< "Dog is wagging by its tail.\n";} voidBegForGrub()const{std::cout<<"Dog is begging for grub.\n";} private: BREEDDog_breed; };

  17. Dědičnost tříd (7/8) Mammal::Mammal()://constructor with inicialization Age(1), Weight(5) { std::cout<<"Constructor of Mammal is active.\n"; } Mammal::~Mammal() { std::cout<<"Destructor of Mammal is active.\n"; } Dog::Dog()://constructor with inicialization Dog_breed(GOLD_RETRIEVER) { std::cout<<"Constructor of Dog is active.\n"; } Dog::~Dog() { std::cout<<"Destructor of Dog is active.\n"; }

  18. int main() { DogFido; Fido.Outspeak();//calling method from parental class Fido.WagByTeil(); Fido.BegForGrub(); std::cout<<"Fido is"<< Fido.GetAge() <<" years old\n"; Fido.SetAge(3); std::cout<<"Fido is now"<< Fido.GetAge()<<" years old\n"; return0; } Dědičnost tříd (8/8) Výsledek: Nejprve se volají konstruk-tory nadřazených tříd, des-truktory pak v opačném sledu Příklad: Ex104.cpp

  19. TÉMA NÁSLEDUJÍCÍ PŘEDNÁŠKY OOP C++ ve Windows, Microsoft Visual Studio DĚKUJI ZA POZORNOST

More Related