Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 11 odgovora
  • 7.538 pregleda

Najnovija ↓

Zasto koristiti virtualne metode? 28.10.2007. u 15:38 · pre 231 mesec
izmenjeno 1 put, poslednji put virtualVoid 28.10.2007. u 20:53
  1. virtualVoid28.10.2007. u 20:53zapis iz teksta poruke
#1
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.
Potpis
...
Re: Zasto koristiti vurtualne metode? 28.10.2007. u 19:40 · pre 231 mesec #2
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.
Re: Zasto koristiti virtualne metode? 28.10.2007. u 21:08 · pre 231 mesec
izmenjeno 1 put, poslednji put virtualVoid 28.10.2007. u 21:30
  1. virtualVoid28.10.2007. u 21:30zapis iz teksta poruke
#5
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 ;)
Potpis
...
Re: Zasto koristiti virtualne metode? 29.10.2007. u 10:27 · pre 231 mesec #6
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.
Potpis
...
Re: Zasto koristiti virtualne metode? 29.10.2007. u 13:46 · pre 231 mesec #7
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.
Potpis
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."
Re: Zasto koristiti virtualne metode? 30.10.2007. u 21:19 · pre 231 mesec #8
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...
Potpis
...
Re: Zasto koristiti virtualne metode? 30.10.2007. u 21:24 · pre 231 mesec #9
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 :)
Potpis
...
Re: Zasto koristiti virtualne metode? 30.10.2007. u 21:40 · pre 231 mesec #10
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.)
Re: Zasto koristiti virtualne metode? 30.10.2007. u 21:51 · pre 231 mesec #11
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'.
Re: Zasto koristiti virtualne metode? 30.10.2007. u 23:04 · pre 231 mesec #12
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. :)
Potpis
...
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme