Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Seminář C++ 6. cvičení Polymorfismus Ing. Jan Mikulka.

Podobné prezentace


Prezentace na téma: "Seminář C++ 6. cvičení Polymorfismus Ing. Jan Mikulka."— Transkript prezentace:

1 Seminář C++ 6. cvičení Polymorfismus Ing. Jan Mikulka

2 Polymorfismus ► princip přetěžování metod v dědičnosti ► ► jedna metoda je v různých třídách svázaných dědičností implementována rozdílně ► ► V odvozených třídách jsou metody předefinovány a pozmění se tak účel metody ► ► Metody, které se mají v odvozených třídách změnit se deklarují s klíčovým slovem virtual

3 Příklad použití ► máme danou třídu Sachy, třída obsahuje metodu algoritmus(), která zajišťuje hru počítače, dále metody pro složité grafické rozhraní ► chceme vytvořit třídu MojeSachy s naprosto stejným grafickým rozhraním, ale jiným algoritmem myšlení ► řešení – vytvoření potomka třídy Sachy, MojeSachy a následné přetížení metody algoritmus() ► výhoda – není nutné zasahovat do původního kódu – jde pouze o přidání v našem kódu

4 Příklad použití class Sachy { protected: // příklad na oprávnění protected - metoda, kterou může potomek přepsat void algoritmus() { puts("Hloupý algoritmus"); } public: void run() { algoritmus(); } }; class MojeSachy : public Sachy { // Odvozený šachový program se změnou algoritmu za chytrý protected: // náš chytrý algoritmus void algoritmus() { puts("Chytrý algoritmus"); } }; void main(void) { MojeSachy sachy; sachy.run(); // nastane problém, metoda run() volá metodu algoritmus() z bázové třídy!!! }

5 Virtuální metody ► Chceme, aby metoda run() bázové třídy Sachy volala metodu algoritmus() podle toho, z jakého objektu ji voláme ► V případě volání Sachy.run() by měla metoda run() volat Sachy::algoritmus() ► V případě volání MojeSachy.run() by měla metoda run() volat přetíženou metodu MojeSachy::algoritmus() ► Minulý příklad toto neřeší! ► Řešení – virtuální metody

6 Virtuální metody class Sachy { //... … … //... … … virtual void algoritmus() virtual void algoritmus() { puts("Hloupý algoritmus"); puts("Hloupý algoritmus"); }}; class MojeSachy : public Sachy { //... … … //... … … virtual void algoritmus() { virtual void algoritmus() { puts("Chytrý algoritmus"); puts("Chytrý algoritmus"); }};

7 Virtuální metody ► Pokud přidáme k metodě algoritmus() klíčové slovo virtual, překladač při překladu SachyKnihovni::run() ví, že odtud má zavolat virtuální metodu algoritmus(), a nemůže tedy vložit jen jednoduché volání funkce. ► Místo toho přidá na místo volání jednoduchý kód, který se podívá do tabulky virtuálních metod daného objektu a zavolá příslušnou metodu. O tom, která metoda se zavolá se tedy rozhoduje až za běhu programu.

8 Zadání cvičení ► Napište třídu Pole, která bude obsahovat jednorozměrné dynamicky alokované pole int, konstruktory a destruktor pro inicializaci pole, metody Print pro výpis pole na konzoli, SortedPrint pro výpis pole seřazeného vzestupně. Tato funkce bude volat protected metodu Sort, která vrátí seřazené pole funkci SortedPrint. ► Napište třídu PoleEx jako potomka třídy Pole, ve které bude pouze přetížená metoda Sort, která vrátí pole seřazené sestupně. ► V hlavním programu vytvořte instanci třídy Pole, volejte metodu SortedPrint, která vypíše pole seřazené vzestupně ► Dále vytvořte instanci třídy PoleEx, volejte metodu SortedPrint, která vypíše pole seřazené sestupně (v případě virtuální metody Sort), resp. vzestupně (bez virtuálních metod) ► program umístěte do samostatného hlavičkového souboru, nakreslete vývojový diagram ► ► použití nového „cout <<“ místo „printf()“ ► použití new a delete ► bodování: funkce (1 bod), rychlost (1 bod), stabilita a délka prog. (1 bod), implementace v hl. souboru (1 bod)


Stáhnout ppt "Seminář C++ 6. cvičení Polymorfismus Ing. Jan Mikulka."

Podobné prezentace


Reklamy Google