Jazyk C++ II. Dynamické identifikace typů



Podobné dokumenty
Jazyk C++ I. Polymorfismus

Jazyk C++ II. Výjimky

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).

Abstraktní třídy, polymorfní struktury

Jazyk C++ I. Šablony 3

Dynamická identifikace typů v C++.

Jazyk C++ I. Polymorfismus

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

Jazyk C++ I. Šablony 2

Jazyk C++ I. Šablony

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Jazyk C++ II. Šablony a implementace

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

(a) vyšší programování se provádí pomocí příkazů, program je psán v tzv zdrojovém kódu. Tyto příkazy jsou člověku bližší a programování je pro

Programování C++ Lukáš Tomášek. verze

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).

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



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

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

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

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Programování II. Polymorfismus

Vstupní a vstupní proudy v C++

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

NÁZEV ROČNÍKOVÉ PRÁCE ročníková práce

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

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

Virtuální metody - polymorfizmus

20. Projekt Domácí mediotéka

Teoretické minimum z PJV

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

Jazyk C++, některá rozšíření oproti C

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

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

INFORMAČNÍ A KOMUNIKAČNÍ TECHNOLOGIE. Ing. Jaroslav Adamus. Gymnázium, SOŠ a VOŠ Ledeč nad Sázavou

Ukazka knihy z internetoveho knihkupectvi

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

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

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

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

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

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

Cvičení 9 - Monitory. monitor m; var proměnné... procedure p; begin... end; begin inicializace; end;

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

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

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

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

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

MQL4 COURSE. By Coders guru -5 Smyčky & Rozhodnutí Část 2

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

Standardní algoritmy v C++.

Interpret jazyka IFJ2011

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

Úvod do programovacích jazyků (Java)

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

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

Výrazy, operace, příkazy

Programování v C++ První kroky

PA152. Implementace databázových systémů

Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Generické programování

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++ 3, 3. cvičení

Výrazy, operace, příkazy

Data, výrazy, příkazy

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

PROGRAMOVÁNÍ V C++ STUDIJNÍ OPORA PRO KOMBINOVANÉ

Zápis programu v jazyce C#

Abstraktní třída a rozhraní

Literatura. Zdroje informací. Petr Peringer peringer AT fit.vutbr.cz

Zpracoval:

Opakování programování

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

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

PRG036 Technologie XML

VYSOKÁ ŠKOLA BAŇSKÁ TECHNICKÁ UNIVERZITA KURZ C++ Materiál ze systému Autoři: Jiří Šebesta, Jakub Sztefek

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo didaktického materiálu

Správa procesů a vláken Mgr. Josef Horálek

Uživatelem řízená navigace v univerzitním informačním systému

RETAIL PROCESS TRACKER VIZUALIZACE OBCHODNÍCH PROCESŮ VAŠEHO INFORMAČNÍHO SYSTÉMU

Návod na instalaci programu evito Win Service. Instalace programu evito Win Service

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

VY_32_INOVACE_5 Anglický jazyk Vypracovala: Mgr. Marcela Minaříková Téma: 5.37 Test 4-1 Opakování Theme 1 Vznik: září 2012 Číslo projektu:

Parametrizace, harmonogram

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Albrechtova střední škola, Český Těšín, p.o. II. DTP

Dědění, polymorfismus

Předmluva...11 Předpoklady...11 Terminologie...12 Typografické konvence OOP pro mírně pokročilé...13

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

usimt10 JEDNOTKA IMPLEMENTUJÍCÍ OBJEKTY PRO SIMULACI TERMINÁLU TERM10 NA PC Příručka uživatele a programátora

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

Aktualizace softwaru Uživatelská příručka

Jazyk C++ II. STL knihovna kontejnery část 1

PREPROCESOR POKRAČOVÁNÍ

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

Transkript:

Jazyk C++ II Dynamické identifikace typů AR 2013/2014 Jazyk C++ II

Úvod Jak můžeme zjistit druh objektu, na který ukazuje ukazatel? V případě nemusíme typ objektu znát, pokud se jedná o funkci virtuální, kterou vlastní všechny třídy v hierarchii. Co když odvozený objekt obsahuje nezděděnou metodu? Jak registrovat typy vytvářených objektů? AR 2013/2014 Jazyk C++ II 2

RTTI Run-time type information. Informace o dynamických typech. Jeden z posledních doplňků jazyka C++. Způsob, jak zjistit typ objektu za běhu. RTTI řeší otázky z předchozí obrazovky. AR 2013/2014 Jazyk C++ II 3

RTTI RTTI můžeme použít pouze v rámci hierarchii tříd obsahujících virtuální funkce. Na podporu RTTI má jazyk C++ tři komponenty: Operátor dynamic_cast, Operátor typeid, Struktura type_info. Potřebný hlavičkový soubor <typeinfo>. AR 2013/2014 Jazyk C++ II 4

Operátor dynamic_cast Generuje ukazatel na typ odvozený od ukazatele na základní typ, pokud to je možné. Pokud to není možné, tak vrátí hodnotu 0. Neodpovídá na otázku na jaký typ objektu ukazatel ukazuje, ale zda můžeme adresu objektu bezpečně přiřadit ukazateli na určitý typ. AR 2013/2014 Jazyk C++ II 5

Operátor dynamic_cast Obecný výraz: dynamic_cast<type *> (pt) Pokud je odkazovaný objekt (*pt) typu Type nebo je přímo či nepřímo odvozen od typu Type: Konvertuje ukazatel pt na ukazatel na typ Type. Pokud není: Výraz se vyhodnotí jako 0 (nulový ukazatel). AR 2013/2014 Jazyk C++ II 6

Operátor typeid Vrací hodnotu identifikující přesný typ objektu. Umožňuje určit, jestli jsou dva objekty stejného typu. Podobně jako operátor sizeof má dva typy parametrů: Název třídy, Výraz, který se vyhodnotí na objekt. Operátor typeid vrací odkaz na objekt třídy type_info. AR 2013/2014 Jazyk C++ II 7

Třída type_info Třída type_info slouží jako návratový typ pro operátor typeid. Třída obsahuje následující členské metody: Before zjišťuje, jestli je typ prvního parametru před druhým typem v implementaci. Name vrací název třídy, Přetížený operátor ==, Přetížený operátor!=. AR 2013/2014 Jazyk C++ II 8

Třída type_info Typeid(Trida) == typid(*uktrida) Se vyhodnotí na hodnotu true, pokud ukazatel uktrida ukazuje na objekt třídy Trida. Jinak se vyhodnotí na hodnotu false. Pokud bude ukazatel uktrida nulový, tak se vyvolá výjimka bad_typeid. AR 2013/2014 Jazyk C++ II 9

Třída type_info cout << Nyní se zpracovává typ << typeid(*uktrida).name() << endl; if(typeid(tridaa).before(typeid(tridab)) ) else cout << Třída A je před třídou B ; cout << Třída B je před třídou A ; AR 2013/2014 Jazyk C++ II 10

Operátory přetypování Problém se zbytečnými a nebezpečnými způsoby přetypování. Z tohoto důvodu byly zavedeny nové čtyři operátory přetypování: dynamic_cast, const_cast, static_cast, reinterpret_cast. Místo obecného přetypování můžeme vybrat operátor vhodný pro konkrétní účel. AR 2013/2014 Jazyk C++ II 11

Operátor dynamic_cast dynamic_cast<název-typu> (výraz) Účelem tohoto operátoru je umožnit v hierarchii tříd přetypování na předka a znemožnit jiná přetypování. Takovéto přetypování je díky vztahu je bezpečné. AR 2013/2014 Jazyk C++ II 12

Operátor const_cast const_cast <název-typu> (výraz) Slouží na přetypování konstantního ukazatele na nekonstantní a naopak. Dále také pro přetypování s modifikátorem volatile. Výsledek tohoto přetypování je chybný, jestliže se změní některý jiný aspekt tohoto typu (např. rozdílný typ). Operátor const_cast neumožňuje o změnu veličiny deklarované jako const. AR 2013/2014 Jazyk C++ II 13

Operátor const_cast Tabulka t1; const Tabulka * ut1 = &t1;... Tabulka * ut2 = const_cast<tabulka *>(ut1); //platne const Tabulka * ut3 = const_cast<const Tabulka*> (ut1); //neplatne AR 2013/2014 Jazyk C++ II 14

Operátor static_cast static_cast <název-typu>(výraz) Příkaz je platný jenom tehdy, když lez názevtypu implicitně převést na stejný typ jako je výraz a obráceně. V jiných případech je přetypování chybné. Umožňuje přetypovat v opačném směru a to přetypovat na potomka z předka. AR 2013/2014 Jazyk C++ II 15

Operátor static_cast BTrida binst; OTrida oinst;... BTrida * pb = static_cast< BTrida *> (& oinst); //platné přetěžování na předka OTrida * pl = static_cast< OTrida *> (& binst); //platné přetěžování na potomka AR 2013/2014 Jazyk C++ II 16

Operátor reinterpret_cast reinterpret_cast < název-typu> (výraz) Operátor reinterperet_cast je určený pro riskantní přetypování. Nedovoluje odstranit modifikátor const, ale dovoluje ostatní nebezpečné přetypování. Obvykle se toto přetypování používá při nízkoúrovňovém, implementačně závislém programování a nebývá přenositelná. AR 2013/2014 Jazyk C++ II 17

Operátor reinterpret_cast struct dat {short a; short b }; long hodnota 0xA224B118; dat * pd = reinterpret_cast<dat *> (& hodnota); cout << pd->a; //zobrazí první dva bajty hodnoty AR 2013/2014 Jazyk C++ II 18

Operátor reinterpret_cast Operátor reinterpret_cast ale neumožní skoro vůbec nic. Můžeme ho využívat pro přetypování ukazatele na celé číslo, které je tak dlouhé, aby se do něj náš ukazatel vešel, avšak nemůžeme přetypovat na kratší celé číslo ani na číslo v pohyblivé řadové čárce. Dalším omezením je, že nemůžeme přetypovat ukazatel na funkci na ukazatel na data a nefunguje to ani naopak. AR 2013/2014 Jazyk C++ II 19

Literatura 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++ II 20