Potae a programovn 2 pro obor EST BPC
Počítače a programování 2 pro obor EST BPC 2 E PŘEDNÁŠKA 4 OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně
Přetížení členských funkcí (1/8) Přetížení členských funkcí - umožňuje definovat různé parametry funkce pro různé případy jejich použití. - definuje základní přístup k mnohotvarosti (polymorfismu) objektového programování - 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). - 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í.
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 BPC 2 E_Ex 101 o přetížení konstruktoru Deklarace třídy pro obdélník: 4 x proměnná typu int + 4 x 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 () {} …
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 BPC 2 E_Ex 101. cpp) Rect: : Rect(int top, int left, int bottom, int right) { Top = top; Left = left; Bottom = bottom; Right = right; Top. Left. Set. X(left); Top. Left. Set. Y(top); Top. Right. Set. X(right); Top. Right. Set. Y(top); Bottom. Left. Set. X(left); Bottom. Left. Set. Y(bottom); Bottom. Right. Set. X(right); Bottom. Right. Set. Y(bottom); }
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; Top. Left. Set. X(left); Top. Left. Set. Y(top); Top. Right. Set. X(right); Top. Right. Set. Y(top); Bottom. Left. Set. X(left); Bottom. Left. Set. Y(bottom); Bottom. Right. Set. X(right); Bottom. Right. Set. Y(bottom); } Kompletní deklarace a definice metod třídy umístěna do rect 1. hpp
Přetížení členských funkcí (5/8) Volání obou typů (přetížených) konstruktorů (defaultní a s inicializací) pro vytvoření objektů typu obdélník int main() { //new object with default parameters Rect my_rect_A; int SA = my_rect_A. Get. Area(); 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. Get. Area(); std: : cout << "Area of my_rect_B: " << S << "n"; return 0; } Příklad: BPC 2 E_Ex 109. cpp + rect 1. hpp
Přetížení členských funkcí (6/8) 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ů #include <iostream> class Rect { public: Rect(int wi, int he); ~Rect(){} //two ways, how to print object rectangle: void Print. Rect() const; //with parameters of given object void Print. Rect(int wi, int he) const; //with reiniciated parameters private: int W; int H; };
Přetížení členských funkcí (7/8) Definice obou metod pro vykreslení obdélníku void Rect: : Print. Rect() const { //using params of object Print. Rect(W, H); //calling print method } void Rect: : Print. Rect(int wi, int he) const { //using new parameters for(int i = 0; i < he; i++) { for(int j = 0; j < wi; j++) { std: : cout << "x. DB"; //print char █ } std: : cout << "n"; //print new line } } Tiskne se plný obdélník s danou šířkou a výškou ze znaků █
Přetížení členských funkcí (8/8) 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 int main() { Rect A(25, 5); //new rectangle with initialization std: : cout << "nrectangle A: n"; A. Print. Rect(); // print rectangle with params // of object std: : cout << "nrectangle B: n"; A. Print. Rect(40, 2); // print rectangle with spec. // parameters return 0; } Příklad: BPC 2 E_Ex 110. cpp
Dědičnost tříd (1/14) 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 Student : public Person { }
Dědičnost tříd (2/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 (3/14) Příklad: Ukázka odvození třídy Student od třídy Person a odvození třídy Graduate od třídy Student 1) Definice třídy Person #include <iostream> #include <string. h> using namespace std; class Person //parent class Person { protected: char FName[20]; char SName[20]; int BYear; public: Person() {strcpy(FName, "None"); strcpy(SName, "None"); BYear = 0; };
Dědičnost tříd (4/14) Definice metod třídy Person void Set(char new. FName[], char new. SName[], int new. BYear) { strcpy(FName, new. FName); strcpy(SName, new. SName); BYear = new. BYear; } void Get(char get. FName[], char get. SName[], int *get. BYear) { strcpy(get. FName, FName); strcpy(get. SName, SName); *get. BYear = BYear; }
Dědičnost tříd (5/14) Definice metod třídy Person pokrač. void Print() { cout << endl << "First Name: " << FName << endl; cout << "Surname: " << SName << endl; cout << "Year of Birth: " << BYear << endl; }
Dědičnost tříd (6/14) 2) Odvození definice třídy Student ze třídy Person class Student : public Person //derived class Student from Person { protected: int Stud. ID; char Univ[20]; public: Student(){Stud. ID = 0; strcpy(Univ, "None"); }; void Set. Stud(int new. Stud. ID, char new. Univ[]) { Stud. ID = new. Stud. ID; strcpy(Univ, new. Univ); }
Dědičnost tříd (7/14) Definice funkcí třídy Student void Set(char new. FName[], char new. SName[], int new. BYear, int new. Stud. ID, char new. Univ[]) { Person: : Set(new. FName, new. SName, new. BYear); Set. Stud(new. Stud. ID, new. Univ); } void Print() { Person: : Print(); cout << "Student ID: " << Stud. ID << endl; cout << "University: " << Univ << endl; } void Copy. Personal. Data(Person my. Person) { my. Person. Get(FName, SName, &BYear); } };
Dědičnost tříd (8/14) 3) Odvození definice třídy Graduate ze třídy Student class Graduate : public Student //derived class Graduate from Student { protected: int Grad. Year; public: Graduate() {Grad. Year = 0; } void Set(char new. FName[], char new. SName[], int new. BYear, int new. Stud. ID, char new. Univ[], int new. GYear) { Student: : Set(new. FName, new. SName, new. BYear, new. Stud. ID, new. Univ); Grad. Year = new. GYear; }
Dědičnost tříd (9/14) Definice funkcí třídy Graduate pokrač. void Print() { Student: : Print(); cout << "Graduate year: " << Grad. Year << endl; } };
Dědičnost tříd (10/14) 4) Hlavní program = využití tříd, vytvoření osoby int main() { cout << "New person Emil" << endl; Person Emil_Jahoda; Emil_Jahoda. Set("Emil", "Jahoda", 1993); Emil_Jahoda. Print(); Výstup:
Dědičnost tříd (11/14) Vytvoření studenta cout << "New student Karel" << endl; Student Karel_Kozel; Karel_Kozel. Set("Karel", "Kozel", 1990, 154234, "VUT Brno, FEKT"); Karel_Kozel. Print(); Výstup:
Dědičnost tříd (12/14) Vytvoření absolventa cout << "New graduate Petr" << endl; Graduate Petr_Hornik; Petr_Hornik. Set("Petr", "Hornik", 1992, 157099, "VUT Brno, FEKT", 2017); Petr_Hornik. Print(); Petr_Hornik. Person: : Print(); Výstup:
Dědičnost tříd (13/14) Vytvoření studenta s kopií dat z osoby cout << "Emil becomes a student" << endl; Student Emil_Jahoda_stud; Emil_Jahoda_stud. Print(); Emil_Jahoda_stud. Copy. Personal. Data(Emil_Jahoda); Emil_Jahoda_stud. Print(); Emil_Jahoda_stud. Set. Stud(145687, "VUT Brno, FEKT"); Emil_Jahoda_stud. Print(); Výstup:
Dědičnost tříd (14/14) Pozn. Postupné volání konstruktorů/destruktorů Nejprve se volají konstruktory nadřazených tříd, destruktory se volají při ukončení funkce main() v opačném sledu Příklad: BPC 2 E_Ex 111. cpp
DĚKUJI ZA POZORNOST Téma následující přednášky – Vývojové prostředí MS Visual Studio a OOP C++ projekty
- Slides: 24