prog_cpp
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Následující verze | Předchozí verze | ||
| prog_cpp [2014/08/28 11:22] – vytvořeno 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> |
| - | * 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? | + | class MyClass { |
| - | * když mám objekt obecné třídy, nelze jej přetypovat na různé podtřídy. | + | |
| + | 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? | ||
| + | |||
| + | Když mám objekt obecné třídy, nelze jej přetypovat na různé podtřídy. | ||
| + | |||
| + | http:// | ||
| + | <code c++> | ||
| + | class Animal { /* Some virtual members */ } | ||
| + | class Dog: public Animal {}; | ||
| + | class Cat: public Animal {}; | ||
| + | |||
| + | |||
| + | Dog dog; | ||
| + | Cat cat; | ||
| + | Animal& AnimalRef1 = dog; // Notice no cast required. (Dogs and cats are animals). | ||
| + | Animal& AnimalRef2 = cat; | ||
| + | Animal* AnimalPtr1 = &dog; | ||
| + | Animal* AnimlaPtr2 = &cat; | ||
| + | |||
| + | Cat& | ||
| + | Cat* catPtr1 = dynamic_cast< | ||
| + | Cat& | ||
| + | Cat* catPtr2 = dynamic_cast< | ||
| + | |||
| + | // This on the other hand makes no sense | ||
| + | // An animal object is not a cat. Therefore it can not be treated like a Cat. | ||
| + | Animal | ||
| + | Cat& | ||
| + | Cat* catPtr1 = dynamic_cast< | ||
| + | </ | ||
| + | |||
| + | <code c++> | ||
| + | Animal | ||
| + | // assigns the animal part of the object. | ||
| + | Cat bigCat = animal; // Makes no sense. | ||
| + | // An animal is not a cat!!!!! | ||
| + | Dog bigDog = bigCat; // A cat is not a dog !!!! | ||
| + | </ | ||
| + | |||
| + | <code c++> | ||
| + | std:: | ||
| + | barnYard.push_back(& | ||
| + | barnYard.push_back(& | ||
| + | barnYard.push_back(& | ||
| + | barnYard.push_back(& | ||
| + | |||
| + | Dog* dog = dynamic_cast< | ||
| + | </ | ||
| ===== SLT kontejnery ===== | ===== SLT kontejnery ===== | ||
prog_cpp.1409217774.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
