[ virtualVoid @ 28.10.2007. 14:38 ] @
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]
[ yaelo @ 28.10.2007. 18:40 ] @
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.
[ X Files @ 28.10.2007. 19:00 ] @
Ako si uopšte i mislio na virtuelne, a ne na statičke metode, imaš nešto ovde:
http://www.elitesecurity.org/t241153-0
[ virtualVoid @ 28.10.2007. 19:03 ] @
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
[ virtualVoid @ 28.10.2007. 20:08 ] @
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]
[ virtualVoid @ 29.10.2007. 09:27 ] @
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.
[ karas @ 29.10.2007. 12:46 ] @
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.
[ virtualVoid @ 30.10.2007. 20:19 ] @
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...
[ virtualVoid @ 30.10.2007. 20:24 ] @
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
[ X Files @ 30.10.2007. 20:40 ] @
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.)
[ X Files @ 30.10.2007. 20:51 ] @
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'.
[ virtualVoid @ 30.10.2007. 22:04 ] @
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.