Dedeni a objekty – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dedeni a objekty – C / C++ – Fórum – Programujte.comDedeni a objekty – C / C++ – Fórum – Programujte.com

 

advanced
~ Anonymní uživatel
2 příspěvky
30. 6. 2010   #1
-
0
-

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";}


};

Nahlásit jako SPAM
IP: 77.48.244.–
liborb
~ Redaktor
+18
Guru
30. 6. 2010   #2
-
0
-

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.

Nahlásit jako SPAM
IP: 85.207.166.–
Palmik0
Super člen
30. 6. 2010   #3
-
0
-

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

Nahlásit jako SPAM
IP: 85.207.177.–
Yesterday is history. Tomorrow is a mystery. Today is a gift and that is why it's called the present.
advanced
~ Anonymní uživatel
2 příspěvky
30. 6. 2010   #4
-
0
-

To liborb : diky moc vsem, si to musim jeste ujasnit, kdy se to da puzit aby to bylo nejak vyhodne

Nahlásit jako SPAM
IP: 77.48.244.–
zdenda
~ Anonymní uživatel
257 příspěvků
30. 6. 2010   #5
-
0
-

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); // <--
...
}

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 42 hostů

Podobná vlákna

Dědění — založil Yety

Dědění — založil opoke

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

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý