Programování v C++ VI

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

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

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

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

Více o konstruktorech a destruktorech

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

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

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

Jazyk C++ I. Polymorfismus

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

Programování II. Polymorfismus

Dědění, polymorfismus

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

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

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

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

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

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

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í v C++ 2, 4. cvičení

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

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

Konstruktory a destruktory

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

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

Generické programování

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

PREPROCESOR POKRAČOVÁNÍ

Dynamická identifikace typů v C++.

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

Mělká a hluboká kopie

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

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

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

Objektové programování

1. Dědičnost a polymorfismus

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

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

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

konstruktory a destruktory (o)

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

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

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

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

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í v jazyce Python

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

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

Objektově orientované programování v jazyce Python

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

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

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

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze

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

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

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.

Objektov orientované programování. C++ Akademie SH. 7. Objektov orientované programování. Michal Kvasni ka. Za áte níci C++ 2.

Programování II. Objektová dekompozice Třída jako objekt 2018/19

Teoretické minimum z PJV

Abstraktní třídy, polymorfní struktury

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.

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

Programování v jazyce C a C++

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

Základy objektové orientace I. Únor 2010

PB161 Základy OOP. Tomáš Brukner

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

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

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

Základy C++ I. Jan Hnilica Počítačové modelování 18

Pole a kolekce. v C#, Javě a C++

Programování II. Návrh programu II

Jazyk C++ II. Šablony a implementace

Připravil: David Procházka. Programovací jazyk C++

Algoritmizace a programování

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

Zpracoval:

Funkční objekty v C++.

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

Syntaxe vyjímek. #include <iostream> #include <string> using namespace std; // Trida vyjimek class Vyjimka { private:

, Brno Připravil: David Procházka Návrhové vzory

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

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

Objektově orientované programování. Úvod

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

Ukazatele, dynamická alokace

Delphi - objektově orientované

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

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

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

Programování v jazyce C a C++

Ukazka knihy z internetoveho knihkupectvi

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Objekty a třídy. Procedurální a objektově orientované programování. V této kapitole se naučíte: Procedurální a objektově orientované programování

Programování v C++ Ostrava, 2006 Rostislav Fojtík

Jazyk C++ I. Šablony 2

C++ objektově orientovaná nadstavba programovacího jazyka C

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

Transkript:

Programování v C++ VI Konstruktory, destruktory a dědičnost

Konstruktory a dědičnost I když jsme se bavili o dědičnosti, trochu jsme zapomněli na konstruktory to se ale nevyplácí, vzpomeňte si, jak důležitý je konstruktor konstruktor se volá vždy při inicializaci objektu a slouží k uvedení členských proměnných do rozumného stavu konstruktor také často alokuje zdroje objektu (paměť, atd.) je dokonce tak důležitý, že pokud ho vynecháme, přidá překladač automaticky konstruktor defaultní a ten nemá žádné parametry a ani nic nedělá (alespoň si to zatím myslíme...)

Konstruktory a dědičnost II pokud je třída potomkem jiné třídy (jiných tříd), počítá každá její funkce s tím, že veškerá funkčnost rodičů je jí již k dispozici a konstruktor není vyjímkou, i konstruktor potomka očekáva, že předek již existuje. potomek a předek jsou sice defacto jeden a ten samý objekt, to, že předek již existuje můžeme chápat spíš tak, že konstruktor potomka očekává, že ta část, odpovídající funkčnosti předka je již ve správném a smysluplném stavu tedy, že již konstruktor předka proběhl ještě před vstupem do těla konstruktoru potomka!!

Konstruktory a dědičnost III pokud existuje defaultní konstruktor (tedy konstruktor bez argumentů), může ho překladač zavolat sám proto zatím naše příklady fungovaly, defaultní konstruktory volal automaticky překladač a právě proto překladač automaticky dodává implicitní defaultní konstruktor, i když ho nedefinujeme dělá to, aby měl místo, na kterém může konstruktory předků volat i když defaultní konstruktor v potomkovi nemusí nic dělat, vždy volá konstruktory předků (pokud existují)

Konstruktory a dědičnost IV co ale dělat, když nemáme defaultní konstruktor k dispozici? pak už překladač nemůže konstruktor zavolat, protože neví, jak inicializovat jeho argumenty o zavolání konstruktorů předků se tedy musíme postarat my a musíme to udělat ještě před vstupem do těla funkce jediná možná cesta je tedy napsat volání konstruktorů předků za seznam argumentů konstruktoru a před otevírací závorku volání konstruktorů předků ale nepatří do hlavičky funkce a proto se zapisují až do implementačního souboru (pokud konstruktor není inlinován, pak je v hlavičce i definice)

Konstruktory a dědičnost V class A { } ; public: A(int i) { cout << Konstruktor A: << i << endl } class B:public A { } public: B():A(5) { } // Defaultni konstruktor B je ted nutne napsat B(int i):a(i+2) { cout << Konstruktor B << I << endl; }

Konstruktory a dědičnost VI protože třída A nemá defaultní konstruktor, třída B nemůže mít konstruktor implicitní protože překladač neví jak volat parametrizovaný konstruktor A musíme ho zavolat sami, což dělá první konstruktor v B druhý konstruktor pak má parametr a volá konstruktor A s tímto upraveným parametrem parametry pro konstruktor předka totiž můžete upravit v rámci jeho volání výrazy (I voláním funkcí (ne však vlastních, metod, ty ještě nejsou dostupné)

Virtuální Destruktory I v souvislosti s dědičností jsme se taky nebavili vůbec o destruktorech což je taky chyba... destruktory jsou stejně důležité jako konstruktory starají se o uvolnění zdrojů objektu, v C++ typicky paměti stejně jako se musí zavolat před konstruktorem potomka všechny konstruktory předků, je situace u destruktoru obdobná všechno je ale obráceně nejdřív se zničí potomek a pak se zničí všichni jeho předkové obojí rekurzivně ;-)

Virtuální destruktory II problém ale nastane, když používáme polymorfismus pokud totiž destruktor není virtuální, zavolání destruktoru polymorfního předka nezpůsobí zavolání destruktoru v potomkovi což vede k segfaultům a dalším méně příjemným věcem, kterých se všichni snažíme vyvarovat zásada by opět měla být: pokud si nejste jisti, že nebudete potřebovat polymorfismus pro destruktory, mějte destruktor vždy virtuální

Virtuální destruktory III class A { public: virtual ~A() { cout << killing A << endl; } } ; class B:public A { public: virtual ~B() { cout << killing B << endl; } } ; void killobject(a* x) { delete x; } killobject(new B());

Konstruktory a destruktory všimněte si, že překladač automaticky rekurzivně volá konstruktory a destruktory předchůdců toto chování je specifické pouze pro konstruktory a destruktory jen tady je totiž nezbytně nutné všude jinde si je musíte vynutit: void overridenmethod() { // do my stuff Parent::overridenMethod(); }

A zase je tu konec... dneska rychle...