prog_cpp
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
| prog_cpp [2014/08/28 11:29] – [Třídy] djbuldog | prog_cpp [2025/08/28 10:09] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
|---|---|---|---|
| Řádek 2: | Řádek 2: | ||
| ===== Třídy ===== | ===== Třídy ===== | ||
| + | |||
| * třida je obdoba struktury. V C++ lze dokonce psát třídy s funkcemi :) | * třida je obdoba struktury. V C++ lze dokonce psát třídy s funkcemi :) | ||
| * při definici se používá viditelnost | * při definici se používá viditelnost | ||
| - | * private - přístupné pouze pro třídu. | + | |
| - | * protected - přístupné pro třídu a potomky třidy. | + | |
| - | * public - přístupné pro všechny | + | |
| - | < | + | < |
| class user { | class user { | ||
| private: | private: | ||
| Řádek 20: | Řádek 21: | ||
| * třída má konstruktor a desktruktor | * třída má konstruktor a desktruktor | ||
| + | * objekt = dynamická/ | ||
| - | * objekty - dynamická/ | + | * pokud ve třídě máme nějakou const položku, musíme ji inicializovat |
| - | * dědičnost, | + | <code cpp> |
| - | * třída dědí vše od svého předchudce | + | class MyClass { |
| - | | + | |
| - | | + | |
| - | | + | |
| + | |||
| + | } | ||
| + | </ | ||
| + | * static const se inicializuje takto | ||
| - | === polymorfismus === | + | <code cpp> |
| + | class MyClass { | ||
| + | |||
| + | private: | ||
| + | static const int number; | ||
| + | } | ||
| + | |||
| + | const int MyClass:: | ||
| + | </ | ||
| + | ==== dědičnost ==== | ||
| + | |||
| + | * třída dědí vše od svého předchůdce | ||
| + | * při deklaraci podřazené třídy se specifikuje, | ||
| + | * zápis '' | ||
| + | * zápis '' | ||
| + | * zápis '' | ||
| + | |||
| + | * virtual | ||
| + | * definuje tzv pozdní vazbu (až při běhu). | ||
| + | * Někdy není v době překladu jasné, jestli se má zavolat metoda podtřídy nebo nadtřidy. | ||
| + | * Klíčové slovo virtual tento problém řeší až při běhu. | ||
| + | * virtuální destruktor | ||
| + | * je potřeba v Base třídě (ze které se dědí) pokud se používá dynamická alokace objektů | ||
| + | * jinak hrozí, že se bude volat pouze destruktor Base třídy - viz triky | ||
| + | * Příklad problému bez virtual: | ||
| + | |||
| + | <code cpp> | ||
| + | class Animal { | ||
| + | public: | ||
| + | void eat() { std::cout << " | ||
| + | } | ||
| + | |||
| + | class Cat : public Animal { | ||
| + | public: | ||
| + | void eat() { std::cout << " | ||
| + | } | ||
| + | |||
| + | //this can go at the top of the main.cpp file | ||
| + | void func(Animal *xyz) { xyz-> | ||
| + | |||
| + | Animal *animal = new Animal; | ||
| + | Cat *cat = new Cat; | ||
| + | |||
| + | animal-> | ||
| + | cat-> | ||
| + | |||
| + | func(animal) // outputs: " | ||
| + | func(cat) | ||
| + | </ | ||
| + | |||
| + | * pro opravu stačí předělat metodu eat u base třídy na virtuální | ||
| + | |||
| + | <code cpp> | ||
| + | class Animal { | ||
| + | public: | ||
| + | virtual void eat() { std::cout << " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * využívá se to pro definici něčeho jako rozhraní/ | ||
| + | * pokud podtřída má nějakou metodu, kterou nadtřída nemá, nelze tuto metodu z nadtřídy zavolat, přestože v objektu nadtřídy máme uložen objekt podtřídy, který tuto metodu má. | ||
| + | * zkrátka, používá se pro případy, kdy potřebujeme definovat u nadtřídy metodu, která v ni není implementovaná | ||
| + | * pokud se metoda neimplementuje, | ||
| + | |||
| + | <code cpp> | ||
| + | class Animal { | ||
| + | public: | ||
| + | virtual void eat() =0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * nebo pro změnu chování nějaké metody základní třídy | ||
| + | * v základní třídě nadefinujeme, | ||
| + | * v určité podtřídě chování virtuální metody předefinujeme | ||
| + | |||
| + | ==== polymorfismus ==== | ||
| + | |||
| + | http:// | ||
| mám obecnou třídu a pak specifické podtřídy. V konstruktoru se inicializuje pro každou specifickou třídu něco jiného. Obecná třída má metodu run. Chci udělat frontu (vector) obecné třídy a při zpracování pak volat metodu run, která zachová podle hodnot nastavených v konstruktoru. Problém: jak to do té fronty dostat? | mám obecnou třídu a pak specifické podtřídy. V konstruktoru se inicializuje pro každou specifickou třídu něco jiného. Obecná třída má metodu run. Chci udělat frontu (vector) obecné třídy a při zpracování pak volat metodu run, která zachová podle hodnot nastavených v konstruktoru. Problém: jak to do té fronty dostat? | ||
| Když mám objekt obecné třídy, nelze jej přetypovat na různé podtřídy. | Když mám objekt obecné třídy, nelze jej přetypovat na různé podtřídy. | ||
| - | |||
| http:// | http:// | ||
| - | < | + | < |
| - | lass Animal { /* Some virtual members */ } | + | class Animal { /* Some virtual members */ } |
| class Dog: public Animal {}; | class Dog: public Animal {}; | ||
| class Cat: public Animal {}; | class Cat: public Animal {}; | ||
| Řádek 63: | Řádek 145: | ||
| </ | </ | ||
| - | < | + | < |
| Animal | Animal | ||
| // assigns the animal part of the object. | // assigns the animal part of the object. | ||
| Řádek 71: | Řádek 153: | ||
| </ | </ | ||
| - | < | + | < |
| std:: | std:: | ||
| barnYard.push_back(& | barnYard.push_back(& | ||
| Řádek 80: | Řádek 162: | ||
| Dog* dog = dynamic_cast< | Dog* dog = dynamic_cast< | ||
| </ | </ | ||
| - | |||
| ===== SLT kontejnery ===== | ===== SLT kontejnery ===== | ||
prog_cpp.1409218168.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
