Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zasto koristiti virtualne metode?

[es] :: C/C++ programiranje :: C/C++ za početnike :: Zasto koristiti virtualne metode?

[ Pregleda: 6519 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

virtualVoid

Član broj: 161084
Poruke: 698



+28 Profil

icon Zasto koristiti virtualne metode?28.10.2007. u 14:38 - pre 200 meseci
Postoji li neki eksplicitni razlog koristenja virtual metoda? Ionako im kod overriding-a mozemo pristupiti okolokole

Code:

pointer->Klasa::funkcija()


Pretpostavljam da razlog lezi u nasljeđivanju i polimorfizmu, ali i dalje ne znam zasto.

[Ovu poruku je menjao virtualVoid dana 28.10.2007. u 20:53 GMT+1]
...
 
Odgovor na temu

yaelo
Rajko Vojnović
Beograd

Član broj: 78087
Poruke: 153
*.smin.sezampro.yu.



+9 Profil

icon Re: Zasto koristiti vurtualne metode?28.10.2007. u 18:40 - pre 200 meseci
Teško je to objasniti ovako preko foruma. Najbolje ti je da nadješ neku knjigu za C++ i polako to naučiš. Ukratko to ti služi da bi pointeru bazne klase dodao objekat nasledjene klase i preko tog pointera pozvao virtuelnu funkciju nasledjene klase.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Zasto koristiti vurtualne metode?28.10.2007. u 19:00 - pre 200 meseci
Ako si uopšte i mislio na virtuelne, a ne na statičke metode, imaš nešto ovde:
http://www.elitesecurity.org/t241153-0
 
Odgovor na temu

virtualVoid

Član broj: 161084
Poruke: 698



+28 Profil

icon Re: Zasto koristiti vurtualne metode?28.10.2007. u 19:03 - pre 200 meseci
Citat:
X Files: Ako si uopšte i mislio na virtuelne, a ne na statičke metode, imaš nešto ovde:
http://www.elitesecurity.org/t241153-0


svaka cast x files. i da mislio sam na virtualne, a sada cu sto prije pobrisati onaj objekt
...
 
Odgovor na temu

virtualVoid

Član broj: 161084
Poruke: 698



+28 Profil

icon Re: Zasto koristiti virtualne metode?28.10.2007. u 20:08 - pre 200 meseci
Komentar nakon citanja teme

Sve je tamo super objasnjeno, ali nije to ono sto mene zanima. Sta u stvari radi kljucna rijec virtual? Zasto na prvom mjestu moramo metode ili destruktore "gurati" u virtual?
U donjem primjeru dobivam isti rezultat stavio ili izostavio "virtual" ispred metoda u klasama Prva i Druga

Code:
class Prva
{
public:
    Prva(){}
    ~Prva(){}
    void prvaIspis()const{cout << "Ja sam u 1. osnovnoj klasi.\n";} //<--
};
class Druga
{
public:
    Druga(){}
    ~Druga(){}
    void drugaIspis()const{cout<<"JA sam u 2. osnovnoj klasi\n";}//<--
};
class Izvedena : public Prva, public Druga
{
public:
    void prvaIspis()const{cout<<"Izvedena no.1\n";}//<--
    void drugaIspis()const{cout<<"Izvedena no.2.\n";}//<--
};
int main()
{
    Izvedena * pIzvedena=new Izvedena;
    pIzvedena->prvaIspis();
    pIzvedena->Prva::prvaIspis(); //ekspl. radi

    pIzvedena->drugaIspis();
    pIzvedena->Druga::drugaIspis();//ekspl. radi
    return 0;
}


Virtual (kako sam ja shvatio) pomaze da jednim pozivom kompajler u run-time modu odredi pozivam li ja funkciju u osnovnoj ili u izvedenoj klasi. Medjutim, ako dodam rijec virtual, opet ne mogu pozvati funkciju iz osnovne klase (osim eksplicitno, naravno). Zbunjen sam...

ps. radim po knjizi C++ u 21 sat i ovaj dio sam procitao doslovce 3 puta, ali mi je i dalje nejasno, a jednostavno me strah preci preko ovoga a da ga ne shvatim. nadam se da razumijete

[Ovu poruku je menjao virtualVoid dana 28.10.2007. u 21:30 GMT+1]
...
 
Odgovor na temu

virtualVoid

Član broj: 161084
Poruke: 698



+28 Profil

icon Re: Zasto koristiti virtualne metode?29.10.2007. u 09:27 - pre 200 meseci
Odgovore na gornja pitanja sam nasao na internetu. Medjutim, ovaj primjer mi ne radi a ne razumijem zasto http://www.devx.com/tips/Tip/22128 . Nije valjda da je greska do njih. IDE je VS 2005.

Code:
class Animal
{
public:
    void MakeSomeNoise()
    {
        cout << "nothing\n";
    }
};

class Bird : public Animal
{
public:
    virtual void MakeSomeNoise()
    {
        cout << "Tweet";
    }
};
int main()
{
    Animal * pAnimal = new Bird;
    pAnimal->MakeSomeNoise();

    return 0;
}


ps. radi ako virtual dodam metodi osnovne klase.
...
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.vlayko.co.yu.



+1 Profil

icon Re: Zasto koristiti virtualne metode?29.10.2007. u 12:46 - pre 200 meseci
I treba da bude virtual u osnovnoj klasi, jer sa
Code:

Animal * pAnimal = new Bird;
pAnimal->MakeSomeNoise();

imaš pokazivač Animal klase na Bird objekat. Kako funkcija Animal klase nije virtuelna on ne zna da treba pozvati funkciju iz Bird klase.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

virtualVoid

Član broj: 161084
Poruke: 698



+28 Profil

icon Re: Zasto koristiti virtualne metode?30.10.2007. u 20:19 - pre 200 meseci
Citat:
karas: I treba da bude virtual u osnovnoj klasi, jer sa
imaš pokazivač Animal klase na Bird objekat. Kako funkcija Animal klase nije virtuelna on ne zna da treba pozvati funkciju iz Bird klase.


ok, znam da treba samo u primjeru nije bila pa me to zbunilo. hvala ipak...
...
 
Odgovor na temu

virtualVoid

Član broj: 161084
Poruke: 698



+28 Profil

icon Re: Zasto koristiti virtualne metode?30.10.2007. u 20:24 - pre 200 meseci
Da li mogu poglavlje o virtualnim funkcijama rezimirati ovako:

Koristimo ih samo kada imamo izvedene klase, kada funkcija u izvedenoj klasi koristi overriding funkcije u osnovnoj klasi, i tada 'virtual' govori kompajleru da pokrene najnizu takvu funkciju u hijerarhiji klasa.

Jesam li ovo dobro shvatio?

ps.po neodgovovaranju na temu, pretpostavljam da sam postavljao glupa pitanja, ali se nadam da mi necete zamjeriti jer ste i vi jednom bili pocetnici
...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Zasto koristiti virtualne metode?30.10.2007. u 20:40 - pre 200 meseci
Citat:

[...] i tada 'virtual' govori kompajleru da pokrene najnizu takvu funkciju u hijerarhiji klasa.

Ne. Ne najnizu, nego onu ciji je objekat ispred... i uopste se ne radi o kompajleru! Odluka se donosi za vreme izvrsavanja. Pokusacu da ti pronadjem jedan primer sa bacanjem kocke (ako uspem, sutra).

U medjuvremenu prouci primer koji ti je dao karas:
Code:

Animal * pAnimal = new Bird;
pAnimal->MakeSomeNoise();

Primeti razliku u odnosu na klase koje se ne izvode:
Tip *pointer = new Tip nasuprot Tip1 *pointer = new Tip2 (naravno, Tip1 i Tip2 moraju biti u nekom 'odnosu' - "jeste" ili "je" ali samo jednosmerno. detaljnije drugi put.)
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Zasto koristiti virtualne metode?30.10.2007. u 20:51 - pre 200 meseci
Evo ti dobar primer na Wiki-ju:
http://en.wikipedia.org/wiki/Virtual_function

Primeti deo koda:
Code:

   for(int i = 0; i < 4; i++)
       anAnimal[i]->eat();


Izlaz na ekran SA VIRTUELNOM funkcijom:
I eat like a generic Animal.
I eat like a wolf!
I eat like a fish!
I eat like a generic Animal.

Izlaz na ekran BEZ VIRTUELNE funkcije:
I eat like a generic Animal.
I eat like a generic Animal.
I eat like a generic Animal.
I eat like a generic Animal.

Kao što vidiš:
Code:

anAnimal[i]->eat();

... u zavisnosti od objekta ispred, izvrsena je i stampa. Drugim recima, nema veze sa kompajlerom, sta je bil 'poslednje'.
 
Odgovor na temu

virtualVoid

Član broj: 161084
Poruke: 698



+28 Profil

icon Re: Zasto koristiti virtualne metode?30.10.2007. u 22:04 - pre 200 meseci
Hvala X files. Sada su mi se poslozile sve kockice. Ne trebas se truditi pisati dalje, jer mi je ovo sada 100% jasno. Hvala jos jednom svima.
...
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Zasto koristiti virtualne metode?

[ Pregleda: 6519 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.