mam dotaz k vytvareni objektu nebot mi neni jasne proc se to tak musi delat u takovych trid
kdyz vytvarim objekt tak se da vytvaret objekt timto zpusobem Auta *skoda = new Sportovniauta(); tady se pouzije metody tridy sportovni auta, a ted nechapu proc by nebylo lepsi vynechat ty virtualni metody(nebo i s nema) a napsat
Sportovniauta *skoda= new Sportovniauta()...a to same u ciste virtualni tridy ...dekuji za odpoved
class Auta
{
virtual void informace(){cout<<"Trida auta";}
};
class Sportovniauta : public Auta
{
virtual void informace(){cout<<"Trida Sportovni auta";}
};
class Klasickeauta : public Auta
{
virtual void informace(){cout<<"Trida Klasicka auta";}
};
Fórum › C / C++
Dedeni a objekty
To, co ti není jasné, se jmenuje polymorfismus. Jde vlastně o to, že základní třídy ti svými (čistě) virtuálními metodami vlastně definuje rozhraní - sadu funkcí, kterou můžeš pro každý objekt, který dědí od základní volat.
Asi si říkáš: to se přece dá zařídit obyčejným děděním, ne?
Ne tak úplně. To, co dělá z polymorfismu tak mocný nástroj máš vlastně naznačeno v tvém kódu. Máš proměnnou typu Auto, ale inicializuješ ji objektem dceřiné třídy. Kdyby si těch typ aut měl více (teď máš 2) a vytvořil si třeba pole, tak by bylo typu Auto, jednotlivé objekty by si ale vytvořil jako instanci zvolené dceřiné třídy a následně v kódu už nemusíš nic řešit - prostě jenom voláš funkce, které definuješ v třídě Auto a polymorfismus/virtuální funkce "zařídí", že se správně zavolá implementace, která je z dceřiné třídy, na kterou si dané Auto vytvořil instanci.
Dejme tomu, že máš obchod s auty. Dejme tomu, že pro tento obchod s auty chceš také vytvořit nějaké interface, vytvoříš tedy asi třídu, které obsahuje nějaký vektor aut... pokud bychom chtěli použít tvůj způsob, jaký jsi popisoval, museli bychom mít minimálně dva vektory, jeden pro Klasickaauta a druhý pro Sportovniauta (pokud samozřejmě nepřidáš další druh auta) -- což nás značně omezuje například i v budoucím rozšíření obchodu na další typy automobilů.
Pokud ovšem využijeme virtuálních metod a toho jak fungují, bude nám, pokud jsme navrhli naše třídy správným způsobem, stačit pouze jeden vektor a to vector<Auta*> do kterého můžeme ukládat jak Sporotvniauta tak Klasikaauta a pokud zavoláme jejich metody (v případě, že daná metoda je ve třídě Auta virtuální), bude zavolána buď verze metody Sportovních aut, nebo Klasických aut (Překladač si totiž v takovémto případě vytváří speciální tabulku, do které ukládá, jaké verze je daný objekt, aby věděl jakou verzi metody má zavolat).
Co se týče abstraktních tříd, tedy tříd s čistě virtuálními metodami, u nich nejenže máš možnost přepsat danou metodu v odvozené třídě stejně jako u virtuálních metod a platí pro ně tedy i to co jsem zmínil dříve o virtuálních metodách. Velká změna je, že nelze vytvořit objekt abstraktní třídy (+ další logicky plynoucí omezení), ale když od takové třídy odvozuješ další třídu (což se u virtuálních tříd očekává), musíš definovat všechny čistě virtuální metody té abstraktní třídy.
Editoval Palmik: Tak Libor mě předběhl :P
si to musim jeste ujasnit, kdy se to da puzit aby to bylo nejak vyhodne
Vždycky, když je Ti jedno, jaká auta to jsou.
void info(Auta *pAuta) { pAuta->informace(); } // <--
int main() {
Sportovniauta *pSA = new Sportovniauta();
Klasickaauta *pKA = new Klasickaauta();
info(pSA); // <--
info(pKA); // <--
...
}
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Vysvětlení dědění — založil felix
Dědění java konstruktory — založil elix
OOP - Dedeni s vice tridama — založil Ruda
Moderátoři diskuze