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

JednoduchaDedicnost a polymorfismus – C / C++ – Fórum – Programujte.comJednoduchaDedicnost a polymorfismus – C / C++ – Fórum – Programujte.com

 

Torko
~ Anonymní uživatel
3 příspěvky
23. 6. 2014   #1
-
0
-

Ahoj, mám dotaz ohledně jednoduchého dědění. Když bude mít třída předka svoji virtuálni metodu a potomek by chtěl tuto metodu přetížit, ale zároveň by měla instance potomka používat obě tyto metody? Je možné toho nějak docílit aniž by musel potomek přeimplementovat původní metodu? Příklad:

class A 

{

    virtual void start() {

           std::cout << "test start" << std::endl;

    }

}

class B : public A 

{

    void start(int x) {

           std::cout << "test start " << x << std::endl;

    }

}

void main (void)

{

     B *potomek = new B();

     potomek->start();   // tohle nebude ( pokud start nepreimplementuju) fungovat

     potomek->start(2);

}

Očekávám, že potomek získává VTM předka, tak nerozumím proč nevidí metodu start bez parametru? Mohl by mi to nějak někdo vysvětlit. Děkuju

Nahlásit jako SPAM
IP: 213.250.231.–
KIIV
~ Moderátor
+43
God of flame
23. 6. 2014   #2
-
0
-

ja se trosku divim, ze vidi start s parametrem .. defaultne je pro class vsechno private

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Torko
~ Anonymní uživatel
3 příspěvky
23. 6. 2014   #3
-
0
-

#2 KIIV
Omluvám se samozřejmě jsou obě deklarovány jako public. Čekal sem spíš konstruktivní odpověď

Nahlásit jako SPAM
IP: 213.250.231.–
KIIV
~ Moderátor
+43
God of flame
23. 6. 2014   #4
-
0
-

#3 Torko
konstruktivni odpoved je v tom, ze void start() si uz overridoval tim  void start(int);

treba toto funguje:  

#include <iostream>

class A 
{
public:
    virtual void start() {
           std::cout << "test start" << std::endl;
    }
};

class B : public A 
{
public:
    void startx(int x) {
        std::cout << "test start " << x << std::endl;
    }
};

int main ()
{
     B *potomek = new B();
     potomek->start();
     potomek->startx(2);

     return 0;
}
Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Torko
~ Anonymní uživatel
3 příspěvky
23. 6. 2014   #5
-
0
-

#4 KIIV
Ano tomu příkladu rozumím proč funguje. Teď už rozumím i tomu proč nefunguje moje řešení, děkuji za nakopnutí ...

Nahlásit jako SPAM
IP: 213.250.231.–
voty+1
Návštěvník
24. 6. 2014   #6
-
0
-

#5 Torko
Ahoj, tohle by mělo fungovat samo do sebe, protože metoda start() a start(int) jsou dvě různé metody, takže k žádnému přepisu metody nedošlo.

Potomek tedy "umí" jak metodu start(), kterou zdědil, tak i metodu start(int), kterou implementuje.

Nahlásit jako SPAM
IP: 81.19.38.–
Jednu rozbil a tu druhou ztratil.
KIIV
~ Moderátor
+43
God of flame
24. 6. 2014   #7
-
0
-

#6 voty
no ocividne to tak neni...  start jako start... asi si to moc nerozumi s pretezovanim metod... zkousel sem i verzi, ze sem mel obe metody v interface, a dokud nebyla ani jedna predefinovana, tak to jelo oboje... jakmile se jedna predefinovala, musela byt predefinovana i ta druha

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
voty+1
Návštěvník
24. 6. 2014   #8
-
0
-

#7 KIIV
Aj, mea culpa :( Pomotal jsem to. Je potřeba použít using.

#include <iostream>

class A 
{
public:
    void start()
    {
    	std::cout << "test start" << std::endl;
    }
};

class B : public A 
{
public:
    using A::start;
    void start(int)
    {
	std::cout << "test start" << std::endl;
    }
};


int main ()
{
     B* potomek = new B();
     potomek->start();
     potomek->start(2);

     return 0;
}
Nahlásit jako SPAM
IP: 81.19.38.–
Jednu rozbil a tu druhou ztratil.
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, 63 hostů

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ý