Jazyk C++ I. Polymorfismus



Podobné dokumenty
Jazyk C++ I. Šablony 2

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Jazyk C++ I. Šablony

Jazyk C++ I. Polymorfismus

Programování v C++ 1, 6. cvičení

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Virtuální metody - polymorfizmus

Programování II. Polymorfismus

Chování konstruktorů a destruktorů při dědění

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

Programování v C++ VI

Programování v C++ 1, 5. cvičení

24. listopadu 2013, Brno Připravil: David Procházka

Jazyk C++ I. Šablony 3

Programování v C++ 3, 3. cvičení

PB161 Programování v jazyce C++ Přednáška 4

Jazyk C++ II. Šablony a implementace

Dědění, polymorfismus

Více o konstruktorech a destruktorech

Programování v C++ 2, 4. cvičení

PREPROCESOR POKRAČOVÁNÍ

NMIN201 Objektově orientované programování 1 / :36:09

NPRG031 Programování II 1 / :25:46

Generické programování

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Jazyk C++ II. Dynamické identifikace typů

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Dynamická identifikace typů v C++.

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

přetížení operátorů (o)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Abstraktní třídy, polymorfní struktury

Ukazka knihy z internetoveho knihkupectvi

Jazyk C++ II. Výjimky

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Mělká a hluboká kopie

PB161 Programování v jazyce C++ Přednáška 3

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Programování v C++ 2, 7. cvičení

Úvod do programovacích jazyků (Java)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Úvod do programovacích jazyků (Java)

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Zpracoval:

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

PB161 Programování v jazyce C++ Přednáška 1

Dědičnost (inheritance)

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

PB přednáška (5. října 2015)

PB přednáška (12. října 2015)

PB161 Programování v jazyce C++ Přednáška 4

Základy objektové orientace I. Únor 2010

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

Konstruktory a destruktory

PŘETĚŽOVÁNÍ OPERÁTORŮ

PB161 Programování v jazyce C++ Přednáška 9

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

přetížení operátorů (o)

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

PB161 Programování v jazyce C++ Přednáška 9

20. Projekt Domácí mediotéka

Programování II. Abstraktní třída Vícenásobná dědičnost 2018/19

1. Dědičnost a polymorfismus

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Teoretické minimum z PJV

11. Dědičnost. Dědičnost strana 103

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PB přednáška (21. září 2015)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

konstruktory a destruktory (o)

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Ukazatele a pole. Chceme-li vyplnit celé pole nulami, použijeme prázdný inicializátor: 207 Čárka na konci seznamu inicializátorů

Pokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom

Objektově orientované programování. Úvod

Zpracování deklarací a přidělování paměti

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

PB161 Programování v jazyce C++ Přednáška 8

PB161 programování v C++ Výjimky Bezpečné programování

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

Programování v C++ 2, 8. cvičení

Anotace. Objekt self, Zapouzdření, polymorfismus,

Iterátory v C++. int pole[20]; for (int *temp = pole, temp!= &pole[20]; temp++) { *temp = 0;

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

PB161 Programování v jazyce C++ Přednáška 10

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Přetěžování operátorů

Je C++ vhodné pro embedded systémy?

Seminář Java II p.1/43

PB161 Programování v jazyce C++ Přednáška 9

Transkript:

Jazyk C++ I Polymorfismus AR 2013/2014 Jazyk C++ I

Úvod Metody s časnou vazbou jsou překládány jako obyčejné céčkovské funkce. Této metodě je předán jako první implicitní parametr this. Rozdíl mezi obyčejnou funkcí a metodou s pozdní vazbou je pouze v tom, že překladač u metody kontroluje, zda je volaná skutečně na správný objekt. AR 2013/2014 Jazyk C++ I 2

Časná vazba Překladač v době překladu ví přesně jaká metoda bude kdy vykonána. Překladač zná adresu podprogramu, na který má předat řízení včas. V době překladu. AR 2013/2014 Jazyk C++ I 3

Časná vazba class Base { void f() { cout << "Method of Base class\n"; } }; class Inherited : public Base { void g() { cout << "Method of Inherited class\n"; } } AR 2013/2014 Jazyk C++ I 4

Časná vazba Co když ale potřebujeme, aby se vykonání dané metody chovalo jinak než u předka? AR 2013/2014 Jazyk C++ I 5

Časná vazba Co když ale potřebujeme, aby se vykonání dané metody chovalo jinak než u předka? Můžeme přepsat metodu AR 2013/2014 Jazyk C++ I 6

Časná vazba class Base { void Early() { cout << "Method of Base class with early binding\n"; } }; class Inherited : public Base { void Early() { cout << "Method of Inherited class with early binding\n"; } } AR 2013/2014 Jazyk C++ I 7

Časná vazba Co když ale potřebujeme, aby se vykonání dané metody chovalo jinak než u předka? Můžeme přepsat metodu Použít pozdní vazbu AR 2013/2014 Jazyk C++ I 8

Pozdní vazba Překladač u metod volaných pozdní vazbou nerozhoduje na jakou instanci je metoda volaná. V době kompilace. Používá se u metod deklarovaných jako virtuální. AR 2013/2014 Jazyk C++ I 9

Pozdní vazba Virtuální metoda = metoda volaná pozdní vazbou. Klíčové slovo virtual před deklarací metody překladači přikazuje použít pozdní vazbu při volání metody. V definici mimo třídu se specifikátor virtual vyskytovat nesmí. AR 2013/2014 Jazyk C++ I 10

Pozdní vazba class Base { void Early() { /*... */} virtual void Late() { cout << "Method of Base class with late binding\n"; } }; class Inherited : public Base { void Early() { /*... */} virtual void Late() { cout << "Method of Inherited class with late binding\n"; } } AR 2013/2014 Jazyk C++ I 11

Pozdní vazba Každá instance, která má alespoň jednu virtuální metodu má v sobě navíc ukazatel na tzv. tabulku virtuálních metod (TVM). Ukazatel není volně přístupný. TVM obsahuje adresy virtuálních metod. O správnou inicializaci ukazatel na TVM se postará překladač. AR 2013/2014 Jazyk C++ I 12

Pozdní vazba Omezení: Metoda označená jako virtuální nemůže být současně označená jako inline. Konstruktor nemůže být virtuální. Instance musí být korektně inicializována. AR 2013/2014 Jazyk C++ I 13

Pozdní vazba Base* p = (Base*)malloc(sizeof(Inherited)); //p->late(); //not! p->early(); free(p); Output: Method of Base class with early binding AR 2013/2014 Jazyk C++ I 14

Pozdní vazba class Base { int _x; Base(const int& x) : _x(x) { } virtual ~Base() {}; }; class InheritedA : public Base { InheritedA(const int& x) : Base(x) {} virtual void Print() { cout << typeid(*this).name() << endl; } virtual ~InheritedA() { } }; AR 2013/2014 Jazyk C++ I 15

Pozdní vazba class InheritedB : public InheritedA { }; InheritedB(const int& x) : InheritedA(x) {} virtual void Print() { cout << typeid(*this).name() << endl; } virtual ~InheritedB() { } Base* ba = new InheritedA(1); Base* bb = new InheritedB(2); //ba->print();//not! //bb->print();//not! InheritedA* ia = dynamic_cast<inheriteda*>(ba); InheritedA* ib = dynamic_cast<inheriteda*>(bb); ia->print(); ib->print(); Output: class InheritedA class InheritedB AR 2013/2014 Jazyk C++ I 16

Abstraktní třídy Třída, která může být použita pouze jako předek jiné třídy a nelze od ní vytvářet instance. Třída se stává abstraktní třídou, jestli obsahuje alespoň jednu čistě virtuální metodu. AR 2013/2014 Jazyk C++ I 17

Abstraktní třídy Čistě virtuální metoda virtual prototype = 0; Prototype je informační deklarace nevirtuální metody. class Comparable { int CompareTo(const Comparable& seconde) = 0; } AR 2013/2014 Jazyk C++ I 18

Abstraktní třídy class AbstractClass { virtual void Print() = 0; ~AbstractClass() { } }; class ConcreteClass : public AbstractClass { ConcreteClass() { } virtual void Print(); ~ConcreteClass() { } }; void ConcreteClass::Print() { cout << typeid(concreteclass).name() << endl; } //AbstractClass* a1 = new AbstractClass; //not! AbstractClass* a2 = new ConcreteClass; a2->print(); Output: Class ConcreteClass AR 2013/2014 Jazyk C++ I 19

Abstraktní třídy class AbstractClass { }; virtual void Print() = 0; ~AbstractClass() { } void AbstractClass::Print() { cout << typeid(abstractclass).name() << '\n'; } class ConcreteClass : public AbstractClass { }; virtual void Print(); ~ConcreteClass() { } void ConcreteClass::Print() { AbstractClass::Print(); cout << typeid(concreteclass).name() << endl; } AR 2013/2014 Jazyk C++ I 20

Abstraktní třídy class DataObject { }; virtual void NextRecord() = 0; virtual void PriorRecord() = 0; virtual void AddRecord(const std::string& name) = 0; virtual void DeleteRecord(const std::string& name) = 0; virtual void ShowRecord() = 0; virtual void ShowAllRecords() = 0; AR 2013/2014 Jazyk C++ I 21

Paměťová reprezentace class TA { int a, b; virtual void f(); virtual void g(); }; TA A1, A2; AR 2013/2014 Jazyk C++ I 22

Paměťová reprezentace class TB : public TA { int c; virtual void f(); virtual int h(); }; TB B1, B2; AR 2013/2014 Jazyk C++ I 23

Třídní ukazatele Kromě klasických ukazatelů máme možnost pracovat ještě s třídními ukazateli. AR 2013/2014 Jazyk C++ I 24

Třídní ukazatele Klasické ukazatele class TA { int x; int f(); //... }; int (*uf)(); uf = &A.f; uf = A.f; // Error // Error TA A; int *ux; ux = &A.x; // OK AR 2013/2014 Jazyk C++ I 25

Třídní ukazatele Třídní ukazatel = ukazatel do třídy Pracuje s adresami atributů a metod tříd. Představují relativní adresu určité složky vzhledem k začátku instance. NameOfClass::*Declarator; AR 2013/2014 Jazyk C++ I 26

Třídní ukazatele Třídní ukazatel lze porovnávat pomocí operátorů == a!=. Nelze na ně použít operátory <, <=, > nebo >=. Nelze na něj aplikovat adresovou aritmetiku. Ukazatel do třídy A lze implicitně přetypovat na ukazatel do třídy B, kde B je potomek třídy A. Takovéto přetypování je chybné, pokud se jedná o nedostupného, virtuálního nebo nejednozačného předka. Celočíselnou konstantu s hodnotou 0 lze přetypovat na třídní ukazatel jakéhokoli typy. Výsledek je třídní ukazatel nikam. AR 2013/2014 Jazyk C++ I 27

Třídní ukazatele lass TA { int x, y; int f(); //... }; TA A1, A2; TA *UA2 = &A2; //deklarace tř. ukazatelů na atribut a na metodu int TA::*ui; int (TA::*uf)(); //deklarace tř. ukazatele s inicializací int TA::*ui2 = &TA::x; ui = &TA::y; uf = TA::f; // operátor & se musí uvést // dtto uf = &TA::f; AR 2013/2014 Jazyk C++ I 28

Třídní ukazatele Dereference třídního ukazatele se vztahuje přímo na konkrétní instanci. Syntaktický zápis dereferenčních operátorů: Instance.*classPointer PointerOnInstance->*classPointer Třídní ukazatele nelze využít k práci se statickými složkami třídy. AR 2013/2014 Jazyk C++ I 29

Třídní ukazatele A1.*ui = 10; // dtto A1.y = 10 A2.*ui = 15; // dtto A2.y = 15 UA2->*ui = 20; // dtto UA2->y = 20 resp. A2.y = 20 AR 2013/2014 Jazyk C++ I 30

Unie Unie nelze považovat za plnohodnotné objektové typy kvůli následujícím omezením: Neumí dědičnost. Pokud nejsou specifikována přístupová práva pro složky unie, jsou tyto složky veřejně přístupné. Neumí virtuální metody. Sic může mít konstruktor, destruktor a přetížený operátor =, její atribut nemůže být typu s konstruktorem, destruktorem či přetíženým operátorem =. V anonymní unii nemohou existovat metody ani statické složky. AR 2013/2014 Jazyk C++ I 31

Zdroje PRATA, Stephen. Mistrovství v C++. 3. aktualiz. vyd. Překlad Boris Sokol. Brno: Computer Press, 2007, 1119 s. ISBN 978-80-251-1749-1. AR 2013/2014 Jazyk C++ I 32