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



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

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) Vstup a výstup v C++

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

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

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

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

Programování v C++ VI

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

1. Dědičnost a polymorfismus

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

Abstraktní třída a rozhraní

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

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

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

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

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

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Více o konstruktorech a destruktorech

Konstruktory a destruktory

Programování v jazyce C a C++

Virtuální metody - polymorfizmus

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

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

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

Generické programování

PREPROCESOR POKRAČOVÁNÍ

Jazyk C++ I. Polymorfismus

Dědění, polymorfismus

Programování v jazyce C pro chemiky (C2160) 6. Funkce, struktury

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

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

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

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 4

2 Grafický výstup s využitím knihovny

Programování v jazyce C a C++

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

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

Jazyk C# (seminář 3)

Jazyk C# (seminář 6)

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Programování II. Polymorfismus

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

Mělká a hluboká kopie

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

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

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

Pokročilé programování v jazyce C pro chemiky (C3220) Úvod do jazyka C++

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

Martin Flusser. December 15, 2016

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

Principy objektově orientovaného programování

Java - Kresba. 2/28/11 1/8 Java - kresba

Funkční objekty v C++.

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.

Úvod do programovacích jazyků (Java)

Programování II. Úvod do dědičnosti 2018/19

Projekt Obrázek strana 135

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

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

Objektové programování

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

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

PROGRAMOVÁNÍ V C++ CVIČENÍ

Algoritmizace a programování

Objektově orientované programování v jazyce Python

Objektově orientované programování. Úvod

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

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

Množina v C++ (set, multiset).

8 Třídy, objekty, metody, předávání argumentů metod

Třída DrawingTool. Obrázek 1: Prázdné okno připravené pro kreslení

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

Dědičnost (inheritance)

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

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

Základy objektové orientace I. Únor 2010

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

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

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

Mnohotvarost (polymorfizmus)

Výčtový typ strana 67

1. Téma 03 - Rozhodování

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

Úvod do programování - Java. Cvičení č.4

Java aplety. Předávání parametrů z HTML

Seminář Java IV p.1/38

8. Načítání a zápis PDB souboru

Teoretické minimum z PJV

Jazyk C++ I. Šablony 2

1. Programování proti rozhraní

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

Šablony, kontejnery a iterátory

Dynamická identifikace typů v C++.

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

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

Transkript:

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

Dědičnost tříd Dědičnost umožňuje vytvářet nové třídy z tříd existujících tak, že odvozené třídy (tzv. potomci) dědí vlastnosti základních tříd (tzv. předek nebo rodič) Potomci mají přístup k datovým členům a metodám předků, navíc k ním přidávají vlastní členy třídy Děděním je vytvářena hiearchie tříd Dědičnost přináší úsporu programátorské práce, protože při vytváření potomka můžeme využívat již existujících metod předka Graphic int x, y Circle int radius, color CircleFilled int fillcolor Základní třída pro všechny grafické objekty. Třída Graphic obsahuje souřadnice středu objektu a odpovídající metody. Odvozená třída pro kreslení kružnice. Třída dědí souřadnice středu a přidává poloměr kružnice a také potřebné metody. Odvozená třída pro kreslení vyplněné kružnice. Třída ke zděděným datům přidává barvu pro vyplnění a potřebné metody. 2

Definice třídy potomka Základní třídu definujeme standardním způsobem Odvozená třída obsahuje následující záhlaví: class Odvozena : public Zakladni // Zakladni trida class Graphic Graphic(); void setcentre(int ax, int ay); int x, y; // Souradnice stredu grafickeho objektu // Odvozena trida dedi data a metody zakladni tridy class Circle : public Graphic Circle(); void setradius(int r); int radius; // Polomer kruznice int color; // Barva kruznice 3

Přístup ke členům předka Členy třídy (data a metody) mohou bý specifikovány v sekcích public, protected nebo private, přístup ke členům v jednotlivých sekcích je následující: Přístup public protected private ----------------------------------------------------------------------------------------- metody téže třídy ANO ANO ANO metody potomků ANO ANO NE metody ostatních tříd ANO NE NE a globálních funkcí Členy deklarované jako protected jsou přístupné v metodách vlastní třídy a metodách potomka, nikoliv však v metodách jiných tříd nebo nečlenských funkcích (pro ně jsou přístupné pouze členy deklarované jako public) Potomek dědí data i metody nejen od přímých předků ale též od prapředků (a jejich předků atd...) 4

Přístup ke členům předka - příklad class Graphic // Zakladni trida Graphic(); void setcentre(int ax, int ay); protected: void printcentre(); int x, y; // Souradnice stredu grafickeho objektu class Circle : public Graphic // Circle je odvozena trida void printvalues() printcentre(); /* Vola se zdedena metoda */ int main() Circle circ; circ.setcentre(10, 30); // Metoda setcentre() je zdedena // Nasledujici by nefungovalo, protoze se jedna o protected metodu: circ.printcentre(); circ.printvalues(); // Tohle bude vporadku } 5

Překrytí metod předka V odvozené třídě můžeme deklarovat metodu se stejným jménem jako v předkovi Pokud takovou metodu zavoláme pro objekt odvozené třídy, zavolá se metoda odvozené třídy (tato metoda tedy překryje metodu v předkovi) Pokud chceme zavolat překrytou metodu předka musíme před jejím názvem uvést název třídy předka oddělený pomocí dvou dvojteček (např. Predek::metoda_predka()). 6

Překrytí metod předka příklad 1 class Graphic void printvalues() cout << "Centre: " << x << ", " << y << endl; int x, y; class Circle : public Graphic // Tato metoda prekryva metodu predka printvalues() void printvalues() cout << "Radius, color: " << radius << "," << color << endl; int radius, color; int main() Graphic gra; Circle circ; gra.printvalues(); // Vola se metoda ve tride Graphic circ.printvalues(); // Vola se metoda ve tride Circle circ.graphic::printvalues(); // Vola se metoda ve tride Graphic } 7

Překrytí metod předka příklad 2 class Graphic void printvalues() cout << "Center: " << x << ", " << y << endl; int x, y; class Circle : public Graphic // Nasledujici metoda prekryva metodu predka se stejnym jmenem void printvalues() Graphic::printValues(); // Volame metodu predka // pokud bychom volali pouze printvalues(), zavolala // by se meto metoda Circle::printValues() cout << "Radius: " << radius << endl; cout << "Color: " << color << endl; int radius, color; 8

Konstruktory a dědičnost Při vytvoření objektu odvozené třídy je nejdříve zavolán konstruktor základní třídy, teprve potom konstruktor odvozené třídy tímto je zajištěno, že v okamžiku kdy se začne vykonávat kód konstruktoru potomka, jsou již datové členy předka inicializovány Do konstruktrou základní třídy lze předat argumenty které byly předány konstruktoru odvozené třídy (viz. následující příklad) 9

Konstruktory a dědičnost příklad 1 class Graphic // Konstruktor zakladni tridy se vola jako prvni Graphic() x = 0; y = 0; int x, y; class Circle : public Graphic // Konstruktor odvozene tridy se zavola az po vykonani kodu // konstruktoru zakladni tridy Circle() radius = 0; color = 0; int radius, color; int main() Circle circ; } // Nejdrive se zavola konstruktor ve tride Graphic, // potom konstruktor ve tride Circle 10

Konstruktory a dědičnost příklad 2 class Graphic Graphic(int ax, int ay) x = ax; y = ay; int x, y; class Circle : public Graphic Circle(int ax, int ay, int r, int c); int radius, color; Circle::Circle(int ax, int ay, int r, int c) : Graphic(ax, ay) radius = r; color = c; } int main() Circle circ(20, 30, 5, 1); //Argumenty se predaji konstruktoru ve tride // Circle ten ale nejdrive preda nektere z nich konstruktoru v // tride Graphic, pote se vykona kod v konstruktoru Graphic() // a pak teprve kod v konstruktoru Circle() } 11

Více potomků odvozených z jednoho předka Z jednoho předka lze odvozovat libovolný počet potomků Graphic int x, y Circle int radius int color FilledCircle int fillcolor Rectangle int width int height Triangle int size 12

Vícenásobná dědičnost Potomky lze odvodit z více než jedné základní třídy mluvíme o vícenásobné dědičnosti Deklarace třídy s vícenásobnou dědičností: class Odvozena : public Zakladni_1, public Zakladni_2 Vícenásobná dědičnost se používá v některých standardních knihovnách, v praxi se však její používání nedoporučuje Zakladni_1 Zakladni_2 Zakladni_3 Odvozena Zakladni_1 Zakladni_2 Odvozena_1 Odvozena _2 Odvozena_spojena 13

Dědičnost vs. člen třídy Při tvorbě programů je někdy potřeba rozhodnout, zda-li použijeme k propojení tříd dědičnost, nebo do třídy vložíme objekt jako její člen Pokud si nejsme jisti který přístup je v daném případě lepší, upřednostňujeme v praxi druhou možnost Dědičnost používáme pouze v dobře odůvodněných případech Objekt odvozujeme pomocí dědičnosti pouze v případě, že jejich vztah odpovídá větě: objekt_odvozeny je objekt_zakladni Nevhodný způsob použití dědičnosti: Vhodný přístup bez použití dědičnosti: Circle Rectangle Circle Drawing Circle circ Drawing Rectangle Rectangle rect class Drawing : public Circle, public Rectangle class Drawing Circle circ; Rectangle rect; 14

Dodržujte následující pravidla Při tvorbě programu postupujte pomalu. Nejdříve vytvořte základní třídou teprve později přidejte odvozenou třídu. Vytvořte vždy nejdříve základ třídy (proměnné a konstruktor bez parametrů) a funkci main() a program přeložte, opravte chyby. Potom postupně přidávejte jednotlivé metody, pokaždé přeložte (překladač nesmí hlásit chyby). Pak přidejte odvozenou třídu. V každé třídě vytvořte konstruktor a v něm inicializujte členská data (na základě předaných parametrů nebo vhodnými implicitními hodnotami). Pokud by třída neměla konstruktor, členská data zůstala neinicializovaná. Členská data objektového typu není třeba inicializovat, protože jejich konstruktor se zavolá automaticky a v něm budou inicializována. Při načítání dat od uživatele a při výpisu hodnot vždy vypisujte vhodný informační text, aby uživatel věděl, jaká data má zadat a jaké informace program vypsal.

Cvičení 1. část 1. Vytvořte program obsahující základní třídu Graphic a z ní odvozenou Circle s následujícími vlastnostmi: Třída Graphic bude obsahovat: souřadnice středu grafického objektu (int x, y;) konstruktor s parametry pro inicializaci souřadnic středu: Graphic(int ax, int ay); metodu setvalues(int ax, int ay) pro nastavení souřadnic středu metody getcentrex() a getcentrey() pro získání souřadnic středu metodu printvalues() pro výpis hodnot datových položek třídy (tj. hodnot x a y). Třída Circle bude obsahovat: hodnotu poloměru kružnice (int radius;) a číslo barvy kružnice (int color;) konstruktor s parametry pro inicializaci souřadnic středu, poloměru a čísla barvy (souřadnice středu bude předávat konstruktoru předka): Circle(int ax, int ay, int r, int c); metodu setvalues(int ax, int ay, int r, int c) pro nastavení souřadnic středu, poloměru a čísla barvy (pro nastavení souřadnic středu bude tato metoda volat metodu předka). metodu getradius() pro získání hodnoty poloměru kružnice a getcolor() pro získání čísla barvy metodu printvalues() pro výpis hodnot datových položek třídy (pro výpis souřadnic středu bude tato metoda volat metodu předka) metodu draw() pro vykreslení kružnice pomocí knihovny g2 Ve funkci main() vytvořte objekt typu Circle a inicializujte jeho souřadnice a poloměr vhodnými hodnotami. Vypište na výstup hodnoty objektu zavoláním jeho metody printvalues(), pak ješte zavolejte přímo jeho metodu printvalues() zděděnou z předka Graphic (vypíše jen souřadnice středu). Potom zavolejte metodu setvalues() která nastaví nové hodnoty (souřadnic středu a poloměru) a opět se vypíší pomocí printvalue() na výstup. Nakonec zavolá metodu draw(). 16 2 body

Cvičení 2. část 2. Vytvořte program který bude vycházet z předchocí úlohy, ale implementujte následující modifikace: Vytvořte třídu Rectangle (odvozenou z Graphic) pro kreslení obdélníku. Třída bude mít členy width a height (typu int) a související metody podobné jako ve třídě Circle (tj. setvalues(), getwidth(), getheight(), printvalues() a draw()). Obdélník se bude vždy vykreslovat černou barvou. Pro vykreslení obdélníku použijte funkci g2_rectangle (int dev, double x1, double y1, double x2, double y2). Vytvořte třídu FilledCircle (odvozenou z Circle) pro kreslení kružnice vyplněné barvou. Třída bude mít člen fillcolor pro číslo barvy (typu int) a související metody podobné jako ve třídě Circle (tj. setvalues(), getfillcolor(), printvalues() a draw()) (Pozn.: při vykreslování vyplněné kružnice se musí nejdříve nastavit barva výplně pomocí g2_pen() a vykreslit vyplněná kružnice pomocí g2_filled_circle(), pak nastavit barva kružnice také pomocí g2_pen() a kreslit obrys kružnice pomocí g2_circle()). V každé třídě dále implementujte metodu readvalues(), která načte ty právě ty hodnoty, které daná třída potřebuje (a předtím volá obdobnou metodu předka pro mačtení hodnot vyžadovaných předkem). Program nabídne uživateli možnost kreslit kružnici, čtverec nebo vyplněnou kružnici. Potom si od něj vyžádá příslušné hodnoty souřadnic, poloměru, barvy atd. (voláním metody readvalues()). Na konec na obrazovku terminálu vypíše načtené hodnoty (voláním printvalues()) a vykreslí příslušný objekt. 2 body 17

Cvičení 3. část 3. Vytvořte program který vykreslí obrazec se třemi vyplněnými kružnicemi ohraničenými obdélníkem (viz. obrázek níže), barva výplně kružnic bude specifikována uživatelem. Program bude vycházet z předchocí úlohy. V programu implementujte novou třídu Drawing, která bude obsahovat 3 objekty vyplněné kružnice (typu FilledCircle) a jeden objekt obdélníku (typu Rectangle). Dále bude obsahovat: konstruktor Drawing() metodu readvalues() pro načtení barvy výplně metodu setfillcolor(int fc) pro nastavení barvy výplně všech tří kružnic metodu draw(), která otevře okno a vykreslí do něj tři vyplněné kružnice a ohraničující obdélník. Podle potřeby upravte existující třídy (např. budou potřebovat konstruktory bez parametrů, do třídy FilledCircle doplňte metodu setfillcolor(int fc), okno pro kreslení bude otevřeno v Drawing::draw(), a metody draw() grafických tříd budou přijímat parametr s číslem okna a budou provádět pouze operace kreslení do tohoto okna). 1 bod 18