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

Podobné dokumenty
Virtuální metody - polymorfizmus

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

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

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

Programování II. Polymorfismus

16. února 2015, Brno Připravil: David Procházka. Konstruktory a destruktory

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

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

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

1. Dědičnost a polymorfismus

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

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

Dědění, polymorfismus

Jazyk C++ I. Polymorfismus

Generické programování

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

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

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

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

Více o konstruktorech a destruktorech

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

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

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

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

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

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

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

Konstruktory a destruktory

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

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

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

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

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

Objektové programování

Základy objektové orientace I. Únor 2010

20. Projekt Domácí mediotéka

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

Objektově orientované programování. Úvod

Jazyk C++ I. Šablony 2

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

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

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

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

Programování II. Návrh programu I 2018/19

Mělká a hluboká kopie

Dědičnost (inheritance)

Abstraktní třída a rozhraní

Programování II. Návrh programu II

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.

Úvod do programovacích jazyků (Java)

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

Dynamická identifikace typů v C++.

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

1. Programování proti rozhraní

Jazyk C++ II. Šablony a implementace

PB161 Základy OOP. Tomáš Brukner

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

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Programování II. Dědičnost změna chování 2018/19

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

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

Objektově orientované programování v jazyce Python

PREPROCESOR POKRAČOVÁNÍ

Zpracoval:

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

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

Abstraktní třídy, polymorfní struktury

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

Objektově orientované programování v jazyce Python

Kód, který se nebude často měnit

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

IRAE 07/08 Přednáška č. 1

10. března 2015, Brno Připravil: David Procházka. Programovací jazyk C++

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

Šablony, kontejnery a iterátory

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

konstruktory a destruktory (o)

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

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

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

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

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

3. Třídy. Základní pojmy objektového programování. Třídy

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

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

Funkční objekty v C++.

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

Jazyk C# (seminář 3)

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Seminář Java II p.1/43

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/

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

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

9. Polymorfismus a rozhraní

Šablony, kontejnery a iterátory

SYSTÉMOVÉ PROGRAMOVÁNÍ Cvičení č.1

KTE / ZPE Informační technologie

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Transkript:

24. listopadu 2013, Brno Připravil: David Procházka Dědičnost Základy objektového návrhu

Časná a pozdní vazba Strana 2 / 22 Obsah přednášky 1 Časná a pozdní vazba 2 Rozhraní pro dědičnost 3 Konstruktory a destruktory 4 Shrnutí

Časná a pozdní vazba Strana 3 / 22 Připomenutí 1 int main (){ 2 Otec * tata = new Otec ; 3 tata -> predstavse (); 4 Syn * synek = new Syn ; 5 synek -> predstavse (); 6 Otec * pokus = new Syn ; 7 pokus -> predstavse (); 8... 9 } Při posledním zavolání se vypíše Jsem otec přestože se fyzicky pracuje s instancí třídy Syn. Důvodem je vyhodnocení volání v době překladu časná vazba.

Časná a pozdní vazba Strana 4 / 22 Pozdní vazba Pozdní vazba K tomu, abychom volali metodu podle instance třídy, na kterou ukazatel ukazuje, musíme překladači říct, aby volání metody vyhodnotil až za běhu programu. Tomuto vyhodnocení říkáme pozdní vazba. U časné vazby se ignoruje druh dosazené instance. Pokud by předek neměl metodu implementovánu, nastala by dokonce chyba. V C++ řešíme pomocí klíčového slova virtual u deklarace metody.

Časná a pozdní vazba Strana 5 / 22 Pozdní vazba: příklad 1 class Otec { 2 public : 3 virtual void predstavse (){ 4 cout << " Jsem otec " << endl ; 5 } 6 }; 7 8 class Syn : public Otec { 9 public : 10 void predstavse (){ 11 cout << " Jsem syn " << endl ; 12 } 13 };

Rozhraní pro dědičnost Strana 6 / 22 Obsah přednášky 1 Časná a pozdní vazba 2 Rozhraní pro dědičnost 3 Konstruktory a destruktory 4 Shrnutí

Rozhraní pro dědičnost Strana 7 / 22 Čistě virtuální metoda Čistě virtuální metoda Virtuální metoda, která má pouze definované rozhraní, ale nemá implementaci, je označována za čistě virtuální metodu. Taková metoda slouží k tomu, aby vynutila svoji existenci v potomcích. Např.: čistě virtuální metoda vykresli, v C++ zapsaná: void vykresli() = 0;

Rozhraní pro dědičnost Strana 8 / 22 Abstraktní třída Abstraktní třída Třída, která obsahuje alespoň jednu čistě virtuální metodu je abstraktní třída. Umožňuje definovat rozhraní, které musí splňovat všichni potomci. Abstraktní třídy slouží pouze k dědění, nemohou mít vlastní instance. V řadě jazyků je pro vynucení rozhraní použit místo abstraktní třídy tzv. interface.

Rozhraní pro dědičnost Strana 9 / 22 Abstraktní třída Abstraktní třída Třída, která obsahuje alespoň jednu čistě virtuální metodu je abstraktní třída. Umožňuje definovat rozhraní, které musí splňovat všichni potomci. Abstraktní třídy slouží pouze k dědění, nemohou mít vlastní instance. V řadě jazyků je pro vynucení rozhraní použit místo abstraktní třídy tzv. interface.

Rozhraní pro dědičnost Strana 10 / 22 Příklad: Grafické objekty Visual Paradigm for UML Standard Edition(Faculty of Business and Economics, Mendel University of Agriculture and Forestry in Brno) GrafickyObjekt #stredx : int #stredy : int +GrafickyObjekt(stredX : int, stredy : int) +vykresli() : void +getobsah() : int +getobvod() : int Kruh -polomer : int +Kruh(stedX : int, stredy : int, polomer : int) +vykresli() : void +getobvod() : int +getobsah() : int Ctverec -velikoststrany : int +Ctverec(stredX : int, stredy : int, strana : int) +vykresli() : void +getobvod() : int +getobsah() : int

Konstruktory a destruktory Strana 11 / 22 Obsah přednášky 1 Časná a pozdní vazba 2 Rozhraní pro dědičnost 3 Konstruktory a destruktory 4 Shrnutí

Konstruktory a destruktory Strana 12 / 22 Virtuální konstruktor/destruktor Nemá smysl aby konstruktor byl virtuální. 1 Destruktor může být virtuální. Virtuální destruktor Umožní zavolat destruktor potomka místo pouze obecného destruktoru předka. Pokud je např. u potomka kompozice. Je u předka virtuální destruktor nezbytností. 1 Když vytvářím instanci vím, jaké je třídy (new A).

Konstruktory a destruktory Strana 13 / 22 Dědičnost a konstruktory Postupně se vždy volají konstruktory předků, až po konstruktor aktuální třídy. Pokud nestanovíme jinak, volají se bezparametrické konstruktory předků nebo implicitní konstruktory. Pokud předek nemá bezparametrický konstruktor (nebo není zcela bez konstruktorů), musí se explicitně vybrat, který parametrický konstruktor se má volat a jakými parametry.

Konstruktory a destruktory Strana 14 / 22 Dědičnost a konstruktory: příklad 1 class GrafickyObjekt { 2 protected : 3 int m_stredx ; 4 int m_stredy ; 5 public : 6 GrafickyObjekt ( int stredx, int stredy ){ 7 m_stredx = stredx ; 8 m_stredy = stredy ; 9 } 10 11 void vykresli (){ 12... 13 } 14 };

Konstruktory a destruktory Strana 15 / 22 Dědičnost a konstruktory: příklad (2) 1 class Kruh : public GrafickyObjekt { 2 private : 3 int m_polomer ; 4 public : 5 Kruh ( int stredx, int stredy, int polomer ): 6 GrafickyObjekt ( polomer ) 7 { 8 m_polomer = polomer ; 9 } 10 11 void vykresli (){ 12... 13 } 14 };

Konstruktory a destruktory Strana 16 / 22 Dědičnost a destruktory Destruktory se stejně jako konstruktory nedědí. Na rozdíl od konstruktorů se volají v opačném pořadí. (Od destruktoru aktuální třídy po destruktor nejvzdálenějšího předka.)

Shrnutí Strana 17 / 22 Obsah přednášky 1 Časná a pozdní vazba 2 Rozhraní pro dědičnost 3 Konstruktory a destruktory 4 Shrnutí

Shrnutí Strana 18 / 22 Co je to tedy ten polymorfismus? Objekty dvou tříd mohou mít metodu se stejným názvem, ale rozdílnou implementací. Příkladem je metoda vykresli() u příkladu s graf. objekty, vratzatez() u příkladu s auty, aj. Polymorfismus je využíván v souvislosti s pozdní vazbou vytvoříme si ukazatel na obecného předka, dosazujeme různé potomky a voláme metody definované ve společném rozhraní.

Shrnutí Strana 19 / 22 Shrnutí (co je důležité si pamatovat) Uvědomit si rozdíl mezi časnou a pozdní vazbou. Co je to čistě virtuální metoda a abstraktní třída. (Význam dědičnosti pro definici rozhraní.) Proč je důležitý virtuální destruktor. Jakým způsobem se chovají konstruktory a destruktory při dědění.

Shrnutí Strana 20 / 22 Příklady k procvičení Programátor-manažer Mějme firmu a v ní jsou tři druhy zaměstnanců programátoři, administrativa a manažeři. U všech zaměstnanců je evidováno jméno, početletnapozici... Všichni mají metody vratplat(). U programátora se počítá 30000+početLet*1000, u manažera 50000+početLet*1000, u administrativy 10000+početLet*1000. Dědičnost je nejsilnější vazba. De facto porušuje zapouzdření, protože změna v předkovi se promítá do potomků. Je to nepružná vazba, protože ji za běhu programu nelze měnit.

Shrnutí Strana 21 / 22 Příklady k procvičení: řešení? Zamestnanec Programator Manazer Administrativa Co když manažera povýší na programátora?

Shrnutí Strana 22 / 22 Příklady k procvičení: řešení? Zamestnanec 1 je zamestnan na PracovniPozice Programator Manazer Administrativa