Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilLukáš Sedláček
1
OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E PŘEDNÁŠKA 4
2
Přetížení členských funkcí (1/8) - definuje základní přístup k mnohotvarosti (polymorfismu) objektového programování Přetížení členských funkcí - umožňuje definovat různé parametry funkce pro různé případy jejich použití. - lze s výhodou použít i 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í. - 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).
3
Přetížení členských funkcí (2/8) 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 BPC2E_Ex101 o přetížení konstruktoru Deklarace třídy pro obdélník: 4x proměnná typu int + 4x proměnná typu Point class Rect //rectangle class { public: Rect (int top, int left, int bottom, int right); //initialization with input parameters Rect (); //initialization by default values ~Rect () {} …
4
Přetížení členských funkcí (3/8) Konstruktor pro třídu Rect – inicializace pomocí vstupních int parametrů (stejné jako v hlavičkovém souboru rect.hpp k příkladu BPC2E_Ex101.cpp ) Rect::Rect(int top, int left, int bottom, int right) { 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); }
5
Přetížení členských funkcí (4/8) Konstruktor pro třídu Rect bez inicializace parametrů, soukromé členské proměnné jsou naplněny defaultními hodnotami. 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
6
Přetížení členských funkcí (5/8) Volání obou typů (přetížených) konstruktorů (defaultní a s iniciali- zací) pro vytvoření objektů typu obdélník int main() {//new object with default parameters Rect my_rect_A; int SA = my_rect_A.GetArea(); std::cout << "Area of my_rect_A: " << SA << "\n"; //new object with user parameters Rect my_rect_B(10, 5, 0, 25); int SB = my_rect_B.GetArea(); std::cout << "Area of my_rect_B: " << S << "\n"; return 0; } Příklad: BPC2E_Ex109.cpp + rect1.hpp
7
Přetížení členských funkcí (6/8) #include 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; }; Příklad: Přetížení metod pro kreslení obdélníku – kreslení obdélníku podle parametrů objektu – kreslení obdélníku s vlastní reinicializací parametrů
8
Přetížení členských funkcí (7/8) void Rect::PrintRect() const { //using params of object PrintRect(W, H); //calling print method } 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 char █ } std::cout << "\n"; //print new line } Definice obou metod pro vykreslení obdélníku Tiskne se plný obdélník s danou šířkou a výškou ze znaků █
9
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 params // of object std::cout << "\nrectangle B:\n"; A.PrintRect(40,2); // print rectangle with spec. // parameters return 0; } 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říklad: BPC2E_Ex110.cpp
10
Dědičnost tříd (1/10) Dědičnost tříd: - 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 { }
11
Dědičnost tříd (2/10) Příklad: Ukázka odvození třídy Pes od třídy Savec #include 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 void ZadejVek(int); int VratVahu() const; void ZadejVahu(int); …
12
Dědičnost tříd (3/10) … void Promluvit() const; //výkonné metody void Spat() const; protected: int Vek; //privátní proměnné int Vaha; };
13
Dědičnost tříd (4/10) // 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 protected, RASA jehoRasa;// bude děděna dceřinnou // třídou odvozenou od třídy Pes };
14
Dědičnost tříd (5/10) 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
15
Dědičnost tříd (6/10) Příklad: Třída Dog odvozená ze třídy Mammal a použití #include enum BREED {GOLD_RETRIEVER, POODLE, DACHSHUND, SHEEPDOG, SLEUTH, LABRADOR}; class Mammal //parent class { public: Mammal(); ~Mammal(); int GetAge() const {return Age;} void SetAge(int new_age) {Age = new_age;} int GetWeight() const {return Weight;} void SetWeight(int new_weight) {Weight = new_weight;}
16
Dědičnost tříd (7/10) … void Outspeak() const {std::cout << "Voice of mammal.\n";} void Sleep() const {std::cout << "Psssst. Go to sleep.\n";} protected: int Age; int Weight; };
17
Dědičnost tříd (8/10) class Dog : public Mammal //derived class { public: Dog(); ~Dog(); BREED GetBreed()const {return Dog_breed;} void SetBreed(BREED new_breed) {Dog_breed = new_breed;} void WagByTeil()const {std::cout << "Dog is wagging by its tail.\n";} void BegForGrub()const {std::cout << "Dog is begging for grub.\n";} private: BREED Dog_breed; }; odvozená třída Dog
18
Dědičnost tříd (9/10) Mammal::Mammal(): //constructor with inicialization Age(1), Weight(5) { std::cout << "Constr. of Mammal is active.\n"; } Mammal::~Mammal() { std::cout << "Destr. 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"; }
19
Dědičnost tříd (10/10) int main() { Dog Fido; Fido.Outspeak(); //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"; return 0; } Příklad: BPC2E_Ex111.cpp Výsledek: Nejprve se volají konstruk- tory nadřazených tříd, des- truktory pak v opačném sledu
20
Téma následující přednášky – Vývojové prostředí MS Visual Studio a OOP C++ projekty DĚKUJI ZA POZORNOST
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.