C++ virtualne funkcie

Programovacie jazyky, rady, poradňa...
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

C++ virtualne funkcie

Príspevok od používateľa reDo »

neviem preco mi stale vypisuje A ked tam mam aj B aj C, kde robim chybu, prosim kuknite sa na to a vysvetlite mi to :roll:

Kód: Vybrať všetko

#include <iostream>

class A
{
    public:
    A() {};
    ~A() {};
    virtual void write()
    {
        std::cout << "class A\n";
    }
};

class B: public A
{
    public:
    B() {};
    ~B() {};
    virtual void write()
    {
        std::cout << "class B\n";
    }
};

class C: public A
{
    public:
    C() {};
    ~C() {};
    virtual void write()
    {
        std::cout << "class C\n";
    }
};

void func(A a)
{
    a.write();
}

int main()
{
    A a;
    B b;
    C c;


    func(a);
    func(b);
    func(c);

    return 0;
}
//autoeditácia príspevku (05 Máj 2011, 15:02)
ked dam parameter ako odkaz alebo pointer tak to funguje, ale aj tak mi to prosim vysvetlite vsetko
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ virtualne funkcie

Príspevok od používateľa BX »

Ja to vidím takto. Keď voláš funkciu func(A a); tak si funkcia vytvára novú premennú a ako "kópiu" parametra (či už a,b, alebo c). Tým pádom ona si nemá odkiaľ vycucať, že ty robíš s triedou B, alebo C. Ona si vytvorí novú instance (inštanciu?) triedy A (čo môže, keďže B a C dedia A) a s ňou pracuje - teda aj s jej metódou write();

Keď to predáš odkazom/pointrom, tak vznikne ukazateľ/odkaz na miesto v pamäti a teda pracuje priamo s triedou B, alebo C = nevytvára sa nová instance triedy A.
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Re: C++ virtualne funkcie

Príspevok od používateľa reDo »

ok diky :)
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Re: C++ virtualne funkcie

Príspevok od používateľa johny3212 »

Ked robis s dedicnostou a podobne s triedami, ani sa nesnaz nepouzivat pointre :). Este pre pochopenie virtual.

Kód: Vybrať všetko

A * prem = new B(); //objekt typu A alokujes ako B
A.write(); //zavola ti metodu pre triedu B, lebo je virtualna

pre pouzitie metody, kt. nie je virtualna, mozes objekt pretypovat
B * tmp  = static_cast<B*> (prem); 

//rovnako pouzitie pri volani inych metod, kde dopredu nevies dane vlastnosti objektu, ako to mas vo fun.
void func(A a);
Ale vyvaruj sa miesaniu OOP s globalnymi funkciami, ako si to spravil z func(A a), to nie je moc dobre :). Odporucam ti vsade pouzivat pointre pri vlastnych triedach, okrem matematiky, pre buducnost :).
Viper
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 137
Registrovaný: 14 mar 2012, 13:19

Re: C++ virtualne funkcie

Príspevok od používateľa Viper »

Viem ako sa deklarujú ako sa poživajú ale nechápem prečo? Prečo sa používajú virtuálne funkcie? Chápem ako to funguje ale aj tak nechápem prečo tak zložito a tak. A aj by som chcel vedieť ako často ich používaťe. Za vysvetlenia ďakujem.
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: C++ virtualne funkcie

Príspevok od používateľa metthal »

Skus si najst nieco na internete o polymorfizme.

V skratke ti len poviem to, ze v OOP tvori tvoja trieda niekedy zaklad pre ine triedy a ty vies ze aj ked tie triedy reprezentuju rozlicne objekty, tak niektore vlastnosti maju podobne, kedze dedia zo spolocneho zakladu. Ako priklad ma teraz napada taketo nieco:

Mas tried DopravnyProstriedok, ten obsahuje virtualne metody chod() a zastav(). Tato vlastno ze nieco ide a nieco zastavi je spolocna pre vsetky dopravne prostriedky, ale lisi sa nejakymi drobnostami v pripade inych tried ktore z nej dedia.

Zoberme si teda ze mas triedy Auto a Lietadlo, pricom obe dedia z triedy DopravnyProstriedok. chod() sa vsak pri aute ma spravat inak ako pri lietadle, kedze v aute stlacis spojku, zaradis rychlost a ides, pricom v lietadle to je uz troska zlozitejsie. Rovnake to je aj pri metode zastav().

Skus si fakt nieco najst o tom polymorfizme, ja som ti to vysvetlil tak aby si priblizne chapal co a ako.
Viper
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 137
Registrovaný: 14 mar 2012, 13:19

Re: C++ virtualne funkcie

Príspevok od používateľa Viper »

Ja to chápem ešte som poskúšal viac prikládov. Už tomu rozumiem lepšie ale stále neviem prečo je

Kód: Vybrať všetko

    A *triedaA = new A;
    triedaA->write();
    triedaA = new B;
    triedaA->write();

   
lepšie ako

Kód: Vybrať všetko

  
    A triedaA;
    triedaA.write();
    B triedaB;
    triedaB.write();
Pretože riadky mi to neušetrí deklarovať ju deklarujem...
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: C++ virtualne funkcie

Príspevok od používateľa metthal »

To co tu bolo postovane nechap ako vyuzitie virtualnych metod ale len ako priklad, ako to cele funguje.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ virtualne funkcie

Príspevok od používateľa BX »

Ja som mal s polymorfizmom a jeho využitím v praxi tiež problém a pochybnosti. Polymorfizmus sa využíva skôr až v zložitejších programoch a to, že mu nevieš nájsť miesto znamená, že máš naň ešte čas ;)

Ale len tak na skúšku hodím, skús si napísať program, ktorý bude reprezentovať trebárs ZOO, alebo niečo reálnejšie - okno s ovládacími prvkami, kontajner geometrických tvarov reprezentujúci obrazovku pre vykresľovanie grafiky, alebo sadzbu matematických výrazov ala LaTeX (niečo ako [príloha]) atď.
Prílohy
2012-05-15_141524.png
2012-05-15_141524.png (1.16 KiB) 979 zobrazení
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C++ virtualne funkcie

Príspevok od používateľa harrison314 »

Ja som polymorfizmu nikdy nepochopil z prikladoch na autickach, zvieratkach ani podobnych kravinach, lebo .....

Skusim ty to vysvetlitinak, predstav si ze pises kniznicu pre pracu z obrazkami, a ma podporovat rozne formaty, kazdy z nich mas v pameti reprezentovany nejako inak ( ale vsetko su triedy ).
A chces mat metodu drawLine, ktora nakresli do obrazku ciaru. Namisto toho aby si pouzil milion ifov a kontroloval aky to je typ obrazka a podla toho zvolis metodu ktorou vykteslis dany obrazok. Tak vsetky nove typi obrazkov podedis od abstraktnej triedy Image ktora ma virtualnu metodu drawLine a overaidnes metody. A potom ako programatora ta uz nezaujima do akeho obrazku budes kreslit, len zavolas drawLine.

teda nemisto tohto:

Kód: Vybrať všetko

Image * img = Loader::LoadImage("obrazok.bmp");
if(img->type == BITMAP) ....
if( -|| - ....

if( ... ) drawLineBitmap(img,ciara);
....



napises

Kód: Vybrať všetko

Image *img = Loader::LoadImage("obrazok");
img->drawLine(line);
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ virtualne funkcie

Príspevok od používateľa BX »

harrison314 napísal:Ja som polymorfizmu nikdy nepochopil z prikladoch na autickach, zvieratkach ani podobnych kravinach, lebo .....
To ani ja. Ja by som takéto vyučovanie/príklady zakázal. Totálne idiotiny, ktoré sa snažia kruto produktívnu vec predviesť na kruto neproduktívnom príklade. (aká zvukomaľba : D)
Oveľa radšej by som v knihách videl nejaký normálny (normálny!) kompletný a hlavne niečo robiaci program, na ktorom sa to bude dať pochopiť (A to včetne klonovacích metód a iných vychytávok, ktorým neviem prísť na meno. Nie len základy. Základy sú v tomto na prt, pretože tie nič nedokážu.)
Viper
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 137
Registrovaný: 14 mar 2012, 13:19

Re: C++ virtualne funkcie

Príspevok od používateľa Viper »

Aha už to asi chápem oveľa lepšie podkúšam si pár príkladov atď. Ale už je to dobre ďakujem Bx a Hariison.

//autoeditácia príspevku (15 Máj 2012, 14:49)
Aj ja mám 2 knihy o C++ hodinu som to čítal dookola a snažil sa pochopiť ale moc som z toho nevedel skôr som bol viac vymletý.
Ale až teraz vďaka vám to celkom chápem
Napísať odpoveď