200 likes | 312 Views
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).
E N D
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) • 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í.
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 () {} …
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); }
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
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
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; };
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ů █
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
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)
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)
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)
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)
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; };
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; };
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"; }
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
TÉMA NÁSLEDUJÍCÍ PŘEDNÁŠKY OOP C++ ve Windows, Microsoft Visual Studio DĚKUJI ZA POZORNOST