05 izvodjenje

Upload: dijana30

Post on 06-Jul-2018

234 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/17/2019 05 Izvodjenje

    1/51

    Objektno orijentisanoprogramiranje 1

    Izvođenje klasa

  • 8/17/2019 05 Izvodjenje

    2/51

    12.11.2005.Izvođenje klasa2

    Pojam specijalizacije opšteg Jedna klasa objekata (B) može biti podvrsta neke druge klase (A) Klasa B je specijalni slučaj (a-kind-of ) klase A

    bjekat klase B je i objekat klase A !rimeri"

     # $isari su klasa koja je okarakterisana načinom is%rane mladunaca &esožderi su vrsta sisara koja se %rani mesom Biljojedi su vrsta sisara koja se %rani biljkama

     # 'eometrijske igure u ravni su klasa koja ima koordinate težita

    Krug je vrsta igure u ravni koja je okarakterisana dužinom poluprečnika Kvadrat je vrsta igure u ravni koja je okarakterisana dužinom ivice

     # *ozila su klasa predmeta koji služe za prevoz +eretna vozila su vrsta vozila namenja prevozu stvari i životinja !utnička vozila su vrsta vozila namenjena prevozu ljudi

  • 8/17/2019 05 Izvodjenje

    3/51

    12.11.2005.Izvođenje klasa3

    Izvođenje i nasleđivanje (1) bjekti klase B imaju sve osobine klase A i jo neke specijalne $pecijalnija klasa B se izvodi iz generalnije (optije) klase A

    Klasa B nasleđuje karakteristike klase A" # strukturne karakteristike (atribute) # karakteristike ponaanja (metode)

    ,elacija između klasa B i A se naziva" # nasleđivanje (engl- inheritance)

     # generalizacija.specijalizacija ,elacija nasleđivanja se prikazuje (usmerenim acikličnim) graom

    (/&0 notacija)"

     A B

  • 8/17/2019 05 Izvodjenje

    4/51

    12.11.2005.Izvođenje klasa4

    Izvođenje i nasleđivanje (2)  Ako je klasa B specijalni slučaj (izvedena iz) klase A"

     #  A je osnovna (base)1 a B izvedena (derived )

     #  A je nadklasa (superclass)1 a B podklasa (subclass) #  A je roditelj ( parent )1 a B dete (child )

    bjektni jezici koji podržavaju nasleđivanje #   objektno-orijentisani  (engl- Object-Oriented )

    bjektni jezici koji ne podržavaju nasleđivanje #

      objektno-bazirani (engl- Object-Based ) !ri izvođenju nije potrebno vriti

     # nikakve izmene postoje2e klase # čak ni njeno ponovno prevođenje

  • 8/17/2019 05 Izvodjenje

    5/51

    12.11.2005.Izvođenje klasa5

    Definisanje izvedene klase Izvedena klasa se deinie na slede2i način"

     # između identiikatora klase i znaka {se navodi"

     Ako postoji samo jedna osnovna klasa # jednostruko1ako postoji vie # viestruko izvođenje

    Izvođenje može biti i u vie koraka:  # izvedena klasa može biti osnovna klasa za slede2e izvođenje # takvo izvođenje se ne naziva viestrukim

    virtual

     public

     protected 

     private

    id osnovne

    klase

    ,

    :

  • 8/17/2019 05 Izvodjenje

    6/51

    12.11.2005.Izvođenje klasa6

    Primer izvođenja bjekti izvedene klase sadrže"

     # članove osnovne klase #

    članove navedene u deiniciji izvedene klaseclass Osnovna {  int i; // atribut osnovne klase public:  void  f(); // metoda osnovne klase};

    class Izvedena : public Osnovna {  int j; // atribut izvedene klase

     public: // nasleđen je: int i;  void  g(); // metoda izvedene klase}; // nasleđena je: void f();

  • 8/17/2019 05 Izvodjenje

    7/5112.11.2005.Izvođenje klasa7

    Pristp nasleđenim !lanovima Preko objekta izvedene klase" javnim !lanovima osnovne klase

    se pristpa isto kao i !lanovima izvedene klase

    !rimer"

    void  main () {

      Osnovna b;

    Izvedena d;

      b.f();

      b.g(); // !"#$%&: g je metoda izvedene klase'// a b je objekat osnovne

      d.f(); // objekat izvedene klase d ima i funkiju f'

      d.g(); // i funkiju g

    }

  • 8/17/2019 05 Izvodjenje

    8/5112.11.2005.Izvođenje klasa8

    #onstrktor" destrktor" operator$ Izvedena klasa ne nasleđuje iz osnovne klase"

     # unkciju oerator* 

     # konstruktore (čak ni podrazumevani i kopiraju2i) # destruktore

    Kao i za osnovne klase1 automatski se generiu"+ oerator* koji vri dodelu član po član

     # podrazumevani konstruktor koji ima prazno telo # kopiraju2i konstruktor koji vri inicijalizaciju član po član # destruktor koji ima prazno telo

  • 8/17/2019 05 Izvodjenje

    9/5112.11.2005.Izvođenje klasa9

    %idljivost i prava pristpa ,edeinisanje identiikatora iz osnovne klase

    u izvedenoj klasi sakriva identiikator iz osnovne

    !ristup sakrivenom članu iz osnovne klase",osnovna klasa-::,lan-

    Izvedena klasa nema prava pristupaprivatnim članovima osnovne klase

    0abela roteted: označava deo klase koji je pristupačan

    metodama kako osnovne tako i izvedeni% klasa # članovi u ovoj sekciji se nazivaju zati2enim ( protected )

  • 8/17/2019 05 Izvodjenje

    10/5112.11.2005.Izvođenje klasa10

    Primer prava pristpaclass Osnovna {  int b; protected :  int zb; public:  int jb;};class Izvedena : public Osnovna { public:  void  m(int ) {  jb*zb*;// moze da ristui javnom i zastienom lanu'  b*; // !"#$%&: rivatnom lanu ne moze da ristui

      }};void  f() {  Osnovna b;

    b.zb*; // ne moze da se ristua zastienom lanu}

  • 8/17/2019 05 Izvodjenje

    11/5112.11.2005.Izvođenje klasa11

    &a!ini izvođenja 3ačin izvođenja određuje kvaliikator ispred imena osnovne klase Izvođenje može biti"

     #  javno (ubli) # zati2eno (roteted) # privatno (rivate)

    Bez kvaliikatora1 izvođenje je privatno 3ačin izvođenja određuje nasleđivanje prava pristupa"

     # određuje se stepen kontrole pristupa članovima osnovne klasepreko objekta izvedene klase

     # ne utiče na pravo pristupa iz metoda dotične izvedene klase

  • 8/17/2019 05 Izvodjenje

    12/5112.11.2005.Izvođenje klasa12

    Promena prava pristpa (1)

    Izvođenje

    'lan osnovne klase javni zaštien privatan

     javno  javni zati2en privatan

    zaštieno zati2en zati2en privatan

    privatno privatan privatan privatan

  • 8/17/2019 05 Izvodjenje

    13/5112.11.2005.Izvođenje klasa13

      O % OPromena prava pristpa (2) 4lanu osnovne klase preko objekta izvedene klase

     # ne dozvoljava se ve2e pravo pristupa od originalnog

     # pravo može da se umanji speciikacijom načina izvođenja na taj način se potuje odluka projektanta osnovne klase o zatiti članova

    / slučaju privatnog i zati2enog izvođenja # pravo pristupa nekom članu se može vratiti delimično ili potpuno

    ako je početno pravo bilo javno1 a izvođenje privatno # pravo pristupa se može vratiti na javno ili zati2eno

     # to se postiže eksplicitnim navođenjem člana osnovne klaseu javnom ili zati2enom delu izvedene klase

     # na taj način se pravi izuzetak za konkretni članod promene prava pristupa usled načina izvođenja

  • 8/17/2019 05 Izvodjenje

    14/5112.11.2005.Izvođenje klasa14

      O % O Primer class O {   class I0I: public 0I{

    int b;   public: protected : I0I(){

    int zb; zb*1; // !"#$%&

     public: j2b*1; // O%int j3b'j2b; }}; };

    class 0I : O { // rivatno izvodjenje public:

      O::j3b; // vraanje na nivo ubli  0I () { zb*3; } // moze se ristuiti iz izvedene klase

       protected :

    O::j2b; // delimino vraanje rava ristua};

    void  main () {  0I i;  i.j3b*1; // moze se ristuiti  i.j2b*1; // !"#$%&: ne moze se ristuiti}

  • 8/17/2019 05 Izvodjenje

    15/5112.11.2005.Izvođenje klasa15

    azlika privatnog i javnog izvođenja Između privatnog i javnog izvođenja # sutinska razlika Javno izvođenje realizuje koncept nasleđivanja

     # relacija 5B je vrsta A5 (a-kind-of ) # izvedena klasa ima sve to i osnovna1

    na isti način dostupno korisniku !rivatno izvođenje realizuje koncept sadržanja

     #

    relacija 5A je deo B5 (a-part-of ) # semantički slično sa slučajem kada B sadrži član tipa A # kod privatnog izvođenja dete ne može da zameni roditelja

    O4 o*new 0I() // !"#$%&

  • 8/17/2019 05 Izvodjenje

    16/5112.11.2005.Izvođenje klasa16

    Izvođenje strktra $trukture su ravnopravne sa klasama

     # mogu2e je izvođenje1 ali se podrazumeva javno

    /nije se ne mogu izvoditi1niti se iz unije može izvoditi

  • 8/17/2019 05 Izvodjenje

    17/5112.11.2005.Izvođenje klasa17

    #onstrktori i destrktori !rilikom kreiranja objekta izvedene klase1

    poziva se konstruktor te klase1 ali i konstruktor osnovne klase

    !rilikom unitavanja objekta izvedene klase1poziva se destruktor te klase1 ali i destruktor osnovne

    !renos parametara konstruktoru osnovne klase" # u listi inicijalizatora konstruktora izvedene klase

    mogu2e je navesti i inicijalizator osnovne klase

     # inicijalizator osnovne klase se sastoji od imena osnovne klasei argumenata poziva konstruktora osnovne klase

  • 8/17/2019 05 Izvodjenje

    18/5112.11.2005.Izvođenje klasa18

    Primer inicijalizacije osnovne klaseclass Osnovna {  int bi; public:

      Osnovna(int); // konstruktor osnovne klase};Osnovna::Osnovna (int i) : bi(i){/4...4/}

    class Izvedena : public Osnovna {

      int di; public:  Izvedena(int);};Izvedena::Izvedena (int i) : Osnovna(i)'di(i53){/4...4/}

  • 8/17/2019 05 Izvodjenje

    19/51

    12.11.2005.Izvođenje klasa19

    edosled konstrkcije !ri kreiranju objekta izvedene klase

    redosled poziva konstruktora je slede2i"

     # inicijalizuje se podobjekat osnovne klase1pozivom konstruktora osnovne klase

     # inicijalizuju se podaci članovi1 po redosledu deklarisanja najpre klasni (pozivom nji%ovi% konstruktora ) zatim ugrađeni tipovi

     #

    izvrava se telo konstruktora izvedene klase !ri unitavanju objekta izvedene klase

    redosled poziva destruktora je uvek obratan

  • 8/17/2019 05 Izvodjenje

    20/51

    12.11.2005.Izvođenje klasa20

    Primer redosledaclass & { public:  &() {out,,6%onstruktor &.6,,endl;}  7&() {out,,68estruktor &.6,,endl;}};

    class O { public:  O() {out,,6%onstruktor O.6,,endl;}  7O() {out,,68estruktor O.6,,endl;}};

    class I : public O {  & a;

     public:  I() {out,,6%onstruktor I.6,,endl;}  7I() {out,,68estruktor I.6,,endl;}};

    void  main () { I d; }

    Izlaz:%onstruktor O.

    %onstruktor &.%onstruktor I.8estruktor I.8estruktor &.8estruktor O.

  • 8/17/2019 05 Izvodjenje

    21/51

    12.11.2005.Izvođenje klasa21

    Pojam polimorfizma !otrebno je projektovati klasu geometrijski% igura 9igura

     # sve igure treba da imaju metodu rtaj() 

    Iz klase geometrijske igure se izvode klase kruga1 kvadrata1 trougla itd- Izvedena klasa treba da realizuje metodu crtanja na sebi svojstven način / nekom delu programa sve igure koje se nalaze na crtežu treba nacrtati 677 omogu2ava da igure jednostavno iscrtamo na slede2i način"

    void  rtanje (int brfigura' 9igura44 nizfigura){

      for (int i*1; i,brfigura; i55)  nizfigurai

  • 8/17/2019 05 Izvodjenje

    22/51

    12.11.2005.Izvođenje klasa22

    Decentralizacija odgovornosti Bitno u pret%odnom primeru" decentralizacija odgovornosti

     # program koji crta sve igure ne zna kako se crta pojedina igura

    $vaki objekat 2e 5prepoznati5 kojoj izvedenoj klasi pripada1iako mu se obra2amo kao objektu osnovne klase !olimorizam" svaki objekat izvedene klase izvrava metodu

    onako kako je to deinisano u njegovoj izvedenoj klasi1iako mu se pristupa kao objektu osnovne klase

    !ol8morp%ism 9 !ol8 (vie) 7 &orp% (oblik) # ista metoda ima vie 5oblika5 # tip objekta za koji se zove metoda određuje koja metoda se poziva # me%anizam je potpuno dinamički # klasa objekta se određuje

    pri izvravanju programa1 a ne pri prevođenju

  • 8/17/2019 05 Izvodjenje

    23/51

    12.11.2005.Izvođenje klasa23

    #onverzija bjekat javno izvedene klase je i objekat osnovne klase !osledice su"

     # pokazivač na objekat izvedene klase se može implicitno konvertovatiu pokazivač na objekat osnovne klase # pokazivač na objekat osnovne klase se može samo eksplicitno konvertovati

    u pokazivač na objekat izvedene klase # konverzija naniže # nije bezbedna # isto važi i za reerence # objekat osnovne klase se može inicijalizovati objektom izvedene klase

     # objektu osnovne klase može se dodeliti objekat izvedene klase bjekat privatno izvedene klase nije i objekat osnovne klase

     # pokazivač na objekat privatno izvedene klase se može implicitno konvertovatiu pokazivač na objekat osnovne klase samo unutar izvedene klase

  • 8/17/2019 05 Izvodjenje

    24/51

    12.11.2005.Izvođenje klasa24

    %irtelne (polimorfne) metode *irtuelne metode"

     # metode osnovne klase koje se u izvedenim klasama mogu redeinisati1a ponaaju se polimorno

    !olimorna klasa" # klasa koja sadrži barem jednu polimornu metodu

    *irtuelna metoda se u osnovnoj klasi deklarie" # pomo2u ključne reči virtual na početku deklaracije

    !rilikom deklarisanja virtuelni% metoda u izvedenim klasama" # ne mora se stavljati reč virtual

    !ozivom preko pokazivača na osnovnu klasuizvrava se ona metoda koja pripada klasi pokazanogobjekta

  • 8/17/2019 05 Izvodjenje

    25/51

    12.11.2005.Izvođenje klasa25

    Primer virtelne metodeclass >lan?iblioteke { protected :  "aun r; public:

      virtual "aun lati>lanarinu () // virtuelna metoda osnovne klase  { return r=*>@&A&"IA&; }};

    class 0oasni>lan : public >lan?iblioteke { public:  "aun lati>lanarinu () // virtuelna metoda izvedene klase  { return r; }

    };

    void  main () {  >lan?iblioteke 4lanovi311lanova; i55)out,,lanoviilanarinu();}

  • 8/17/2019 05 Izvodjenje

    26/51

    12.11.2005.Izvođenje klasa26

    Pozivanje virtelni* metoda *irtuelni me%anizam se aktivira samo ako se objektu pristupa indirektno

    (preko reerence ili pokazivača)"

    class Osnovna { public: virtual void  f(); };class Izvedena : public Osnovna { public: void  f(); };

    void  g3(Osnovna b) { b.f(); }void  g2(Osnovna 4b) { b=-f(); }void  gB(Osnovna Crb) { rb.f(); }

    void  main () {  Izvedena d;  g3(d); // oziva se Osnovna::f

      g2(Cd); // oziva se Izvedena::f  gB(d); // oziva se Izvedena::f  Osnovna 4b*new Izvedena; b=-f(); // oziva se Izvedena::f  Osnovna Crb*d; rb.f(); // oziva se Izvedena::f  Osnovna b*d; b.f(); // oziva se Osnovna::f

      delete b; b*Cb; b=-f();// oziva se Osnovna::f}

  • 8/17/2019 05 Izvodjenje

    27/51

    12.11.2005.Izvođenje klasa27

    Dinami!ko vezivanje :inamičko vezivanje (engl- dynamic binding )"

     # me%anizam koji obezbeđuje da se metoda koja se poziva određuje" po tipu objekta1

    ne po tipu pokazivača ili reerence na taj objekat dlučivanje koja 2e se virtuelna metoda (iz koje klase) pozvati

     # obavlja se u toku izvravanja programa ; dinamički # bitna je razlika u odnosu na me%anizam preklapanja imena unkcija koji je statički

    *irtuelna metoda osnovne klase ne mora da se redeinie u svakoj izvedenoj klasi # u izvedenoj klasi u kojoj virtuelna metoda nije deinisana1

    važi značenje te virtuelne metode iz osnovne klase

    :eklaracija virtuelne unkcije u izvedenoj klasi # mora da se potpuno slaže sa deklaracijom iste u osnovnoj klasi # potpuno slaganje znači" da se podudaraju broj i tipovi argumenata1 kao i tip rezultata # izuzetno" ako je tip rezultata reernca ili pokazivač na osnovnu klasu1

    redeinisana unkcija može da vra2a reerencu.pokazivač na izvedenu klasu

  • 8/17/2019 05 Izvodjenje

    28/51

    12.11.2005.Izvođenje klasa28

    Implementacija virtelni* poziva

  • 8/17/2019 05 Izvodjenje

    29/51

    12.11.2005.Izvođenje klasa29

    Primer + virtelni me*anizamclass O{   void  main(){

     public: I i; O o;

      int a; O 4o*Ci;

      virtual void  f(); o=-g(); // semantika: (4(o=-DE93

  • 8/17/2019 05 Izvodjenje

    30/51

    12.11.2005.Izvođenje klasa30

    ,akrivanje virtelni* metoda $akrivanje virtuelni% metoda iz osnovne klase

     # ako se u izvedenoj klasi deinie neka metoda koja ima"

    isto ime kao i virtuelna metoda iz osnovne klase različit broj i.ili tipove argumenata

     # takva metoda sakriva sve metode sa istim imenom iz osnovne klase # u izvedenoj klasi treba ponovo deinisati sve metode sa tim imenom

    nije dobro da izvedena klasa sadrži samo neke metode iz osnovne klase"ne radi se o pravom nasleđivanju

    korisnik izvedene klase očekuje isti (ili proireni) interejs osnovne klase

    3ije speciično samo za virtuelne metode # važi i za nevirtuelne

  • 8/17/2019 05 Izvodjenje

    31/51

    12.11.2005.Izvođenje klasa31

    Osobine polimorfni* metoda *irtuelne (polimorne) metode ne mogu biti statičke  Ako je potrebna statička metoda sa polimornim ponaanjem

     # ova metoda treba da poziva nestatičku virtuelnu metodu za neki objekat

     # pokazivač ili reerenca na objekat čija se metoda pozivamože da se prenese kao argument poziva statičke metode

    !rimer"class F{

     public:

    virtual void  m()const{};

    static void  s(const FC);

    };

    void  F::s(const FC ){ .m();}

    'lobalne prijateljske unkcije ne mogu biti polimorne # ako je potrebno polimorno ponaanje # sličan recept kao za statičke metode

    *irtuelne metode mogu biti prijatelji drugi% klasa

  • 8/17/2019 05 Izvodjenje

    32/51

    12.11.2005.Izvođenje klasa32

    %irtelni destrktor  Konstruktor ne može biti virtuelna unkcija

     #  jer se poziva pre nego to se objekat kreira

    :estruktor može da bude virtuelna unkcija # ako je destruktor virtuelna unkcija1tek u vreme izvrenja se odlučuje koji destruktor se poziva

    Kada se unitava dinamički kreirani objekat (pomo2u delete ) # destruktor osnovne klase se uvek izvrava # ili kao jedini ili posle destruktora izvedene klase

    Kada neka klasa ima neku virtuelnu unkciju1verovatno i njen destruktor (ako ga ima) treba da bude virtuelan

    /nutar destruktora izvedene klase # ne treba pozivati destruktor osnovne klase (implicitno se poziva)

  • 8/17/2019 05 Izvodjenje

    33/51

    12.11.2005.Izvođenje klasa33

    Primer virtelnog destrktoraclass OE8 { public: virtual 7OE8(); };class IE8: public OE8 { public: 7IE8(); };

    class OnE8{ public: 7OnE8(); };class InE8: public OnE8 { public: 7InE8(); };

    void  oslobodi (OE8 4b) { delete b; }void  oslobodi (OnE8 4b) { delete b; }

    void  main () {

      OE8 4b*new OE8; oslobodi(b); // 7OE8()  IE8 4d*new IE8; oslobodi(d); // 7IE8()' 7OE8()  OnE8 4bn*new OnE8; oslobodi(bn); // 7OnE8()  InE8 4dn*new InE8; oslobodi(dn); // 7OnE8()}

  • 8/17/2019 05 Izvodjenje

    34/51

    12.11.2005.Izvođenje klasa34

    &izovi i izvođenje / jeziku 677 niz objekata nije objekat 3iz objekata izvedene klase nije jedna vrsta niza objekata osnovne klase  Ako se niz objekata izvedene klase prenese unkciji

    kao niz objekata osnovne klase1 može do2i do greke !rimer"

    class Osnovna { public: int bi; };class Izvedena : public Osnovna { public: int di; };void  f(Osnovna 4b' int i) { out,,bi

  • 8/17/2019 05 Izvodjenje

    35/51

    12.11.2005.Izvođenje klasa35

    Prenos zbirki objekata fnkcijama  Ako se računa sa nasleđivanjem1 pravilo"

     # u programu ne treba koristiti nizove objekata1 ve2 nizove pokazivača na objekte

    void  f(Osnovna 44b' int i) { out,,bi

  • 8/17/2019 05 Izvodjenje

    36/51

    12.11.2005.Izvođenje klasa36

    -pstraktne metode i klase  Apstraktna (čista virtuelna) metoda"

     # virtuelna metoda koja nije deinisana za osnovnu klasu

    :eklaracija apstraktne metode u osnovnoj klasi" # umesto tela stoji *1  Klasa koja sadrži barem jednu apstraktnu metodu

    naziva se apstraktnom klasom (engl- abstract class)  Apstraktna klasa ne može imati instance (objekte)1

    ve2 se iz nje samo mogu izvoditi druge klase &ogu da se ormiraju pokazivači i reerence na apstraktnu klasu !okazivači i reerence na apstraktnu klasu

    mogu da ukazuju samo na objekte izvedeni% konkretni% klasa

  • 8/17/2019 05 Izvodjenje

    37/51

    12.11.2005.Izvođenje klasa37

    Primer apstraktne klaseclass Osnovna { public:  virtual void  vf () *1; // astraktna metoda

    virtual void  vf (); // virtuelna metoda};

    class Izvedena : public Osnovna { public:  void vf();};

    void  main () {

      Izvedena izv' 4i*Cizv;Osnovna osn; // !"#$%&: Osnovna je astraktna klasa

      Osnovna 4o*Cizv;o=-vf();// oziva se Izvedena::vf()

      o=-vf(); // oziva se Osnovna::vf()}

  • 8/17/2019 05 Izvodjenje

    38/51

    12.11.2005.Izvođenje klasa38

    .eneralizacija i konkretizacija  Apstraktna klasa predstavlja generalizaciju izvedeni% klasa !rimer"

     #

    sve geometrijske igure treba da mogu da odrede svoju povrinu # u osnovnoj klasi 9igura se ne zna kako se uopteno izračunava povrina # svaka izvedena klasa iz klase 9igura 2e znati kako se izračunava povrina

    Klasa koja se izvodi iz apstraktne je jedna konkretizacija te klase  Ako se u izvedenoj klasi iz apstraktne ne navede deinicija neke

    apstraktne metode iz osnovne klase i izvedena klasa je apstraktna  Apstraktna klasa može imati konstruktor 

     # iako se ne mogu konstruisati objekti apstraktne klase # on 2e se pozivati kao konstruktor osnovne klase pri konstrukciji

    objekata konkretni% klasa koje se izvode iz apstraktne klase

  • 8/17/2019 05 Izvodjenje

    39/51

    12.11.2005.Izvođenje klasa39

    Problem konverzije nani/e !roblem"

     # preko pokazivača.reerence na osnovnu klasu

    nije mogu2e pristupiti članovima izvedene klase # samo ako znamo tačno kog tipa je objekat na koji ukazujepokazivač.reerenca na osnovnu klasu možemo eksplicitno konvertovati pokazivač na osnovnu

    u pokazivač na izvedenu klasu # ovakva konverzija se naziva konverzijom naniže (downcast) # konverzija naniže nije bezbedna

    ,eenje" # da se izvede konverzija pokazivača.reerence naniže # ali da se pri tome proveri njena ispravnost # postiže se operatorom za dinamičku konverziju tipa

  • 8/17/2019 05 Izvodjenje

    40/51

    12.11.2005.Izvođenje klasa40

    Operator dinami!ke konverzije Izrazi za dinamičku konverziju tipa"

    dynamic_cast,izvedena klasa4-(okazivaH)

    dynamic_cast,izvedena klasaC-(referena) # konvertuju pokazivač.reerencu na polimornu osnovnu klasu

    u pokazivač.reerencu na izvedenu klasu  Ako pokazivač ne pokazuje na objekat izvedene klase

    u koju se vri konverzija1 ili njene potklase"

     # rezultat je 1  Ako reerenca ne upu2uje na objekat izvedene klase

    u koju se vri konverzija1 ili njene potklase" # baca se izuzetak badast (deinisan u ,teinfo.J-)

  • 8/17/2019 05 Izvodjenje

    41/51

    12.11.2005.Izvođenje klasa41

    Primer dinami!ke konverzijeclass & { public: virtual void  vm(){}}; // olimorfna klasa

    class ?: public &{/4...4/};

    class >: public &{/4...4/};void  main(){

      & 4a*new ?();

      ? 4b*dynamic_cast,?4-(a);

      > 4*dynamic_cast,>4-(a); //**1

      ? Crb*dynamic_cast,?C-(4a);> Cr*dynamic_cast,>C-(4a); // badast

    }

  • 8/17/2019 05 Izvodjenje

    42/51

    12.11.2005.Izvođenje klasa42

    Dinami!ko određivanje tipa Jezik 677 omogu2ava da se u vreme izvravanja odredi tip izraza

    typeid (izraz)

    typeid (nazivtia) # izraz"

    može biti proizvoljnog tipa" # standardnog. korisničkog #  jednostavnog.složenog

    vrednost se ne izračunava1 nema ni bočni% eekata ako ukazuje na objekat polimorne klase1

    rezultat se odnosi na dinamički tip operanda1 inače na statički ako je u izrazu typeid (4) **1  izuzetak badteid # naziv>tipa" proizvoljan tip # rezultat" const teinfoC

    Introspekcija ili releksija" način da program saznaje o sebi

  • 8/17/2019 05 Izvodjenje

    43/51

    12.11.2005.Izvođenje klasa43

    #lasa type_info

    teinfo je tip iz ,teinfo.J- koji sadrži podatke o tipu &etode klase teinfo"

     bool operator**(const teinfoC) const; bool operator*(const teinfoC) const;

     bool before(const teinfoC) const;

    // uređuje dva objekta tia teinfo (zavisi od rev.)

    const char4 name()const;

    // vraKa neko logiHno ime tia (zavisi od revodioa)

    +ip teinfo nema javne konstruktore # ne mogu se kreirati podaci ovog tpa # razlog zato se ne mogu prenositi podaci ovog tipa po vrednosti

    perator dodele za tip teinfo  je takođe privatan

  • 8/17/2019 05 Izvodjenje

    44/51

    12.11.2005.Izvođenje klasa44

    Primer određivanja tipaclass O {}; // neolimorfna klasa

    class I: public O{ public: virtual void f(){}};

    class II: public I{};

    void  main(){  O 4o*new I;

      I 4i*new II; //Izlaz (?orland):

      out,,(typeid (4o)**typeid (I)),,endl; //1

      out,,(typeid (4i)**typeid (II)),,endl; //3

      out,,typeid (O).name(),,endl; //O

      out,,typeid (4o).name(),,endl; //O

      out,,typeid (4i).name(),,endl; //II

      out,,typeid (o).name(),,endl; //O 4

      out,,typeid (i).name(),,endl; //I 4

      int m311

  • 8/17/2019 05 Izvodjenje

    45/51

    12.11.2005.Izvođenje klasa45

    0lopotreba određivanja tipa bjektno;orijentisane programe treba koncipirati tako"

     # da se piu polimorne metode koje decentralizuju odgovornosti odgovornosti se delegiraju pojedinim apstrakcijama

    dređivanje tipa krije zamku" # kada se odredi tip objekta on se može porediti sa klasama

    za dati tip objekta se poziva nepolimorna metoda date klase

     # polimorizam se zamenjuje selekcijom # program ponovo postaje sa centralizovanom odgovorno2u # smanjuje se mogu2nost jednostavnog održavanja koda

  • 8/17/2019 05 Izvodjenje

    46/51

    12.11.2005.Izvođenje klasa46

    %išestrko nasleđivanje *iestruko nasleđivanje (engl- multiple inheritance)"

     # kada klasa direktno nasleđuje osobine vie osnovni% klasa

     # roditeljske klase nisu jedna drugoj vrsta !rimer"

     # konj je životinja1 ali je i prevozno sredstvo # pri tome ni životinja nije vrsta prevoznog sredstva1 ni obrnuto

    Klasa se deklarie kao naslednik vie klasa

    tako to se u zaglavlju navode osnovne klase # ispred svake osnovne klase treba da stoji reč ubli1

    da bi izvedena klasa nasleđivala prava pristupa članovima

    class I: public O3' public O2' public OB {/4...4/};

  • 8/17/2019 05 Izvodjenje

    47/51

    12.11.2005.Izvođenje klasa47

    #onstrkcija i destrkcija !ravila o nasleđenim članovima važe i ovde Konstruktori svi% osnovni% klasa se izvravaju pre

     # konstruktora članova izvedene klase i # konstruktora izvedene klase

    Konstruktori osnovni% klasa se pozivaju po redosledu deklarisanja :estruktori svi% osnovni% klasa se izvravaju posle

     # destruktora izvedene klase i # destruktora članova izvedene klase

    :estruktori osnovni% klasa se pozivaju obrnutim redom

  • 8/17/2019 05 Izvodjenje

    48/51

    12.11.2005.Izvođenje klasa48

    Problem dijamant strktre !roblem"

     # kada su osnovne klase pri viestrukom izvođenju1

    izvedene iz iste roditeljske klase !rimer"

    class ? {/4...4/};

    class F : public ? {/4...4/};

    class L : public ? {/4...4/};

    class M : public F' public L {/4...4/};

    $vaka od klasa F i L ima po jedan primerak članova klase ?  # klasa M 2e imati dva skupa članova klase ?  # nji% je mogu2e razlikovati pomo2u operatora :: 

    z.X::i ili z.Y::i

  • 8/17/2019 05 Izvodjenje

    49/51

    12.11.2005.Izvođenje klasa49

    %irtelne osnovne klase  Ako ovo nije potrebno1 klasu ?' pri izvođenju iz nje1

    treba deklarisati kao virtuelnu osnovnu klasu"

    class ? {/4...4/};class F : virtual public ? {/4...4/};class L : virtual public ? {/4...4/};class M : public F' public L {/4...4/};

    $ada klasa M nasleđuje samo jedan skup članova klase ? # nema dvoznačnosti u pristupu članovima nasleđenim iz ?

    &oraju se i F i L virtuelno izvesti iz ?  # ako je samo jedna izvedena virtuelno ; ostaju dva skupa članova ,edeinicija metode m() deinisane u klasi ? 

     # ili u klasi F ili u klasi L # za z.m() se poziva data redeinicija (nije problem) # i u klasi F i u klasi L # z.m() je dvoznačno (problem)

  • 8/17/2019 05 Izvodjenje

    50/51

    12.11.2005.Izvođenje klasa50

    edosled konstrkcije Konstruktori virtuelni% osnovni% klasa

    se pozivaju pre konstruktora nevirtuelni% osnovni% klasa

    !recizan redosled izvravanja konstruktora" # konstruktori virtuelni% osnovni% klasa

    po dubini stabla izvođenja (najpre koren stabla) sleva;udesno na istom nivou stabla

     # konstruktori nevirtuelni% osnovni% klasa

     # konstruktori atributa # konstrutor izvedene klase

    Konstruktori virtuelni% osnovni% klasa se pozivaju samo jednom

  • 8/17/2019 05 Izvodjenje

    51/51

    Primer redosleda konstrkcijeNinclude ,iostream.J-

    class ? {

     public: ?(){out,,6 ?6;}

    };

     

    class F : virtual  public ? {

     public: F(){out,,6 F6;}

    };

     

    class L : virtual  public ? {

     public: L(){out,,6 L6;}

    };

    class M : public F' public L { public: M(){out,,6 M6,,endl;}

    };

    void  main(){M z;}

     

    // Originalni redosled: // ? F L M

    // 8a je stajalo (jedna o jedna zamena):class F: public ? { // ? ? F L M

    class L: public ? { // ? F ? L M

    class M: public F'

    virtual  public L { // ? L F M

    class M: virtual  public F'

    virtual  public L { // ? F L M