poli morfi zam

24
Virtuelne funkcije i polimorfizam Polimorfizam implementiran u programu C++ pomoću virtuelnih funkcija je treći kamen temeljac objektno orijentisanog programiranja. On obezbedjuje drugu dimenziju odvajanja interfejsa od implementacije. Enkapsulacija omogućava kreiranje novih tipova podataka kombinujući karakteristike i ponašanja klase. Kontrola pristupa odvaja interfejs klase od njene implementacije, čime detalji klase mogu biti privatni i nedostupni za okolne klase.

Upload: rejhan-nisic

Post on 06-Nov-2015

26 views

Category:

Documents


3 download

DESCRIPTION

Poli Morfi Zam

TRANSCRIPT

  • Virtuelne funkcije i polimorfizam Polimorfizam implementiran u programu C++ pomou virtuelnih funkcija je trei kamen temeljac objektno orijentisanog programiranja.On obezbedjuje drugu dimenziju odvajanja interfejsa od implementacije.Enkapsulacija omoguava kreiranje novih tipova podataka kombinujui karakteristike i ponaanja klase.Kontrola pristupa odvaja interfejs klase od njene implementacije, ime detalji klase mogu biti privatni i nedostupni za okolne klase.Virtuelne funkcije omoguavaju stvaranje mnotva razliitih tipova na osnovu definicije jednog tipa.

  • Nasledjivanje i ponaanjeVideli smo da mehanizmom nasledjivanja stvoreni objekt poseduje ponaanje bazne klase kao i izvedene klase kojoj i pripada.Izvedeni objekat pripada novom tipu, odnosno novoj klasi koja je izvedena iz bazne klase. To znai da je izvedeni objekat vrsta baznog objekta. Svi objekti izvedene klase ponaaju se na isti nain, na osnovu definicija funkcija lanica bazne I izvedene klase.Virtuelne funkcije definisane u baznoj klasi, omoguavaju da se objekti nastali iz izvedenih klasa iste bazne klase (slini objekti) ponaaju razliito.Razlike se ispoljavaju u ponaanju opisanom u funkcijama bazne klase kroz virtuelne funkcije.

  • Upcasting#include enum Raspolozenje {Gladan, Besan, Ljut, Zadovoljan};class Sisari{public:void Oglasavanje(Raspolozenje) const { cout
  • Objekt nastao iz izvedene klasePonaanje objekta izvedene klase odredjuju pre svega metode (funkcije bazne klase koje je on nasledio). Objekat izvedene klase satoji se od atributa i ponaanja bazne klase koji dopunjuju atributi i ponaanja izvedene klase. Kada se prosledjuje objekat izvedene klase (preko pokazivaa ili reference) prosledjuje se adresa baznog tipa to se naziva upcasting.Prilikom nasledjivanja, stvoreni objekat se sastoji iz bazne klase (na vrhu) I izvedene klase ispod.

  • ProblemOgleda se u injenici da prosledjeni objekat Ben izvedene klase Pas se ne oglasava kao Pas ve kao i svaki objekat bazne klase Sisari.Tu nastaje problem nazvan upcasting.Kako obavestiti C++ kompajler da je funkciji glas() prosledjen objekat izvedene klase Pas (po referenci) a ne objekat bazne klase Sisari.

  • Virtuelne funkcijeProblem prethodnog primera nastaje zbog injenice da kompajler nije u stanju da pozove pravu funkciju onda kada poziva funkciju klase Sisari. Da li je to funkcija koja pripada baznoj klasi ili izvedenoj klasi.To se naziva problemom kompajlera early binding ili rano uvrtavanje.Problem se reava kasnim uvrtavanjem late binding to znai da binding nastaje za vreme izvrenja programa na osnovu tipa objekta a ne klase kojoj taj objekat pripada ili iz koje je izveden.

  • Dynamic bindingKada jezik poseduje osobinu late binding, mora da postoji mehanizam odrdjivanja tipa objekta koji za vreme izvravanja programa (runtime) poziva odgovarajuu funkciju lanicu.Mehanizam late binding varira od jezika do jezika, ali mora da postoji neka vrsta informacije ubaena u objekt koja to obezbedjuje.Da bi se postigo mehanizam late binding tada C++ zahteva slubenu re virtual kada se deklarie funkcija u baznoj klasi.Mehanizam late binding nastaje samo kod virtuelnih funkcija, i samo kada se koristi adresa bazne klase kod koje virtuelna funkcija postoji.

  • Virtuelna lanica klaseDa bi se kreirala virtuelna funkcija lanica klase, tada prilikom deklaracije funkcije upotrebljavamo slubenu re virtual.Ako je funkcija deklarisana kao virtuelna u baznoj klasi, tada je ona virtuelna i u izvedenoj klasi.Redefinicija virtuelne funkcije u izvedenoj klasi se naziva overriding.Sve izvedene klase koje imaju identian potpis kao virtuelne funkcije bazne klase koristie virtuelni mehanizam.

  • Late binding sa virtuelnom funkcijom#include enum Raspolozenje {Gladan, Besan, Ljut, Zadovoljan};class Sisari{public:virtual void Oglasavanje(Raspolozenje) const { cout
  • Mehanizam late binding Kljuna re late binding naznaava kompajleru da ne vri rano uvrtavanje (early binding). Umesto toga on treba da instalira sve mehanizme za kasno uvrtavanje (late binding). To znai da ako pozovemo funkciju glas() kroz adresu objekta Ben izvedene klase Pas, ona treba da pozove odgovarajuu funkciju oglasavanje(). Da bi se ovo postiglo tipian kompajler kreira tabelu koja se naziva v-tabela za svaku klasu koja sadri virtuelne funkcije. Kompajler smeta adrese virtuelnih funkcija odredjene klase u v-tabelu. U svaku klasu sa virtuelnim funkcijama smeta se pokaziva nazvan vpointer (VPTR), koji pokazuje na v-tabelu za taj objekat. Kada se poziva virtuelna funkcija kroz pokaziva bazne klase (kada se napravi polimorfan poziv) kompajler insertuje kod kojim se uzima VPTR, i trai adresu odgovarajue funkcije i time poziva korektna funkcija ime se ostvaruje kasno uvrtavanje (late binding).

  • Klasa i virtuelne funkcije#include enum Rasa {Terijer,Labrador,Ovcar,Snaucer,Bul_Mastif};

    class Obicna{int a;public:void x() const {}int i() const {return 1;}};

    class Virtuelna1{int a;public:virtual void x() const {}int i() const {return 1;}};

  • class Virtuelna2{int a;public:virtual void x() const {}virtual int i() const {return 1;}

    };

    void main(){cout

  • Veliina objekataKao to vidimo, veliina objekta klase Obicna je veliina jednog celobrojnog podatka int.Sa jednom virtuelnom funkcijom, imamo prethodnu veliinu objekta (4 bajta za int) plus 4 bajta za veliinu void pointera. Na objekat klase Virtuelna1 ima veliinu 8 bajta.Sa dve virtuelne funkcije objekat klase Virtuelna2 ima takodje istu veliinu od 8 bajta. To je zbog toga to VPTR ukazuje na tabelu sa adresama funkcija. Potrebna je samo jedna adresa za jednu klasu, jer tabela na koju pointer ukazuje sadri sve adrese virtuelnih funkcija.

  • #include enum Raspolozenje {Gladan, Besan, Ljut, Zadovoljan};class Sisari{public:virtual void Oglasavanje(Raspolozenje) const { cout
  • class Mastif : public Pas{public:void Oglasavanje(Raspolozenje) const { cout
  • void main(){

    Pas Petronije;Macka Beki;Mastif Ben;Vucjak Laki;glas(Petronije);glas(Beki);glas(Ben);glas(Laki);funkcija(Ben);

    }

  • Pas objekt

    Macka objekt

    Mastif objekt

    Vucjak objekt

    vptr vptr vptr vptr Objekti:Niz pokazivacaA[ ] na objekteklase Sisari

    &Pas::Oglasavanje&Pas::Sta_sam_ja&Pas::disati

    &Macka::Oglasavanje&Macka::Sta_sam_ja&Macka::disati

    &Mastif::Oglasavanje&Mastif::Sta_sam_ja&Mastif::disati

    &Vucjak::Oglasavanje&Vucjak::Sta_sam_ja&Vucjak::disati

  • Virtuelne funkcije i pokazivaiPolje A[ ] pokazivaa na objekte klase Sisari sadr`I adrese etiri objekta.Klasa Sisari ima tri virtuelne funkcije, tako da se za svaki objekat izvedene klase pravi v-tabela.U tu tabelu se smetaju adrese svih funkcija koje su deklarisane kao virtuelne u toj klasi ili u baznoj klasi.

  • Kreiranje objekata - rano i kasno uvrtavanje (binding)#include class Sisari{public:virtual void Oglasavanje() const { cout
  • Apstraktne klase i potpuno virtuelne funkcijeKada elimo da neka klasa bude model na osnovu kojeg izvodimo druge klase, tada tu klasu moemo definisati kao apstraktnu klasu.Apstraktna klasa sadri barem jedan metod (funkciju) koja je potpuno virtuelna.Potpuno virtuelna funkcija sadri virtual kljunu re i zavrava se sa =0.Apstraktna klasa koja sadri potpuno virtuelne funkcije, primorava izvedene klase, da definiu implementaciju za te funkcije.

  • Definicija apstraktne klaseclass Sisari

    {public:virtual void Oglasavanje() const = 0;virtual char* Sta_sam_ja() const = 0;virtual void disati(int) = 0;};

  • Potpuno virtuelne funkcije Korisne su jer eksplicitno naznaavaju apstraktnost klase kako korisniku tako i kompajleru. Time je i njihova primena odredjena. Potpuno virtuelne funkcije onemoguavaju apstraktnu klasu da bude prosledjena funkciji po vrednosti. Potpuno virtuelne funkcije onemoguavaju i object slicing.

  • Nasledjivanje i v-tableNasledjivanjem mo`emo da predefini{emo neke virtuelne funkcije, odnosno da na njima primenimo mehnizam override.Kompajler kreira novu v-table za novu klasu, I insertuje nove adrese funkcija koriste}I adrese funkcija bazne klase za svaku funkciju kod koje nije primenjen mehanizam overrride.Za svaki kreirani objekt postoji pun set adresa funkcija u v-table, tako da nije mogu}e pozvati se na adresu koja nije u tabeli.[ta se de{ava kada nasledimo u izvedenoj klasi virtuelne funkcije I dodamo jo{ neke?