You are on page 1of 38

Objektno orijentisano

programiranje:
Nasleivanje

Nasleivanje
Nasleivanje omoguuje novoj klasi da nasledi

osobine neke postojee klase


Klasa iz koje se izvodi je osnovna klasa (base class,
superclass, parent) ili generika klasa
Izvedena klasa (derived class, subclass, child)
nasleuje sve osobine osnovne klase, ali ima i
sopstvene, jedinstvene osobine
Opti oblik nasleivanja je:
class izvedena_klasa : access osnovna_klasa
{ //telo izvedene klase};
Objektno orijentisano programiranje

Nasleivanje
Najvanija prednost nasleivanja jeste u tome to

kada se jednom napravi osnovna klasa koja


objedinjuje zajednike atribute skupa objekata,
iz nje moe da se izvede proizvoljan broj specifinih,
izvedenih klasa
Time se pojednostavljuje odravanje programa,
a omoguuje i njegovo ponovno korienje

Objektno orijentisano programiranje

Nasleivanje

Objektno orijentisano programiranje

Izvoenje klase
Dostupnost lanova osnovne klase unutar izvedene

klase definie se modifikatorom izvoenja klase


(access) u deklaraciji
Operator pristupa (access) u deklaraciji izvedene
klase nije obavezan, ali ako postoji, mora biti public,
protected ili private
Default vrednost specifikatora pristupa je private,
ako se drugaije ne navede

Objektno orijentisano programiranje

Kontrola prava pristupa


Princip kapsulacije u jeziku C++ podran je

konceptom kontrole prava pristupa lanovima klasa


lan klase moe biti:
o

Privatan (private), to znai da je dostupan samo


funkcijama lanicama iste klase
Zatien (protected), to znai da je dostupan izvedenim
klasama
Javan (public), to znai da je dostupan svima

Nasleivanjem ne mogu da se narue ogranienja


pristupa lanovima osnovne klase koja su ve
definisana
Objektno orijentisano programiranje

Kontrola prava pristupa


Mehanizam kontrole prava pristupa zasniva se na

pristupanosti odreenih lanova, a ne na njihovoj


vidljivosti
Ako se dati lan klase vidi u nekoj oblasti vaenja,
kompajler njegovu upotrebu dozvoljava ili ne u
zavisnosti od njegove specifikacije
Zakljuak: kontrola prava pristupa obavlja se nakon
utvrivanja vidljivosti imena

Objektno orijentisano programiranje

Kontrola prava pristupa

Objektno orijentisano programiranje

Kontrola prava pristupa


Iako izvedena klasa nasleuje sve podatke lanove

osnovne klase, ne moe da pristupi onima koji su


deklarisani kao private
Da bi se izvedenoj klasi omoguio pristup privatnim
lanovima osnovne klase, postoje dva reenja:
o
o

Deklarisati lanove u osnovnoj klasi kao protected


Predvideti u osnovnoj klasi funkcije lanice za pristup
privatnim podacima lanovima (akcesorske funkcije, tj.
inspektore)

Objektno orijentisano programiranje

Korienje modifikatora protected


Zatieni lan se pravi korienjem modifikatora

protected
Kada je lan klase oznaen kao protected, on je
privatan, uz jedan izuzetak, kada se klasa nasleuje
Protected lanu osnovne klase moe da se pristupi
iz izvedenih klasa
Protected omoguuje izvoenje lanova, ali tako da
oni ostaju privatni unutar hijerarhije klasa
Kada je klasa izvedena kao public, protected lanovi
osnovne klase ostaju protected i u izvedenoj klasi
Objektno orijentisano programiranje

10

Modifikator protected

Objektno orijentisano programiranje

11

Javno i privatno izvoenje


Objekti izvedene klase uvek nasleuju sve lanove

osnovne klase, bez obzira da li je izvoenje javno ili


privatno
U zavisnosti od naina izvoenja, pristup odreenim
nasleenim lanovima klase je na nekim mestima
dozvoljen, a na nekim ne

Objektno orijentisano programiranje

12

Javno i privatno izvoenje


Javno izvoenje realizuje pojam nasleivanja; javni
lanovi osnovne klase jesu javni lanovi i izvedene
klase, pa korisnici izvedene klase mogu da vide
sve osobine osnovne klase i u izvedenoj klasi
o

Izvedena klasa je a kind of osnovne klase

Privatno izvoenje realizuje pojam sadravanja


(agregacije): javni lanovi osnovne klase su
sakriveni u izvedenoj klasi, tj. objekti izvedene klase
sadre objekat osnovne klase u sebi
o
o

Osnovna klasa je a part of izvedene klase


Moe se realizovati i lanstvom
Objektno orijentisano programiranje

13

Prijatelji klase
Ponekad je potrebno da se klasa projektuje tako da

ima i povlaene korisnike, odnosno funkcije ili


druge klase koje imaju pravo pristupa do njenih
privatnih i zatienih lanova
Takve funkcije i klase nazivaju se prijateljima
(friends)
Prijateljska funkcija (friend function) je funkcija koja
nije lanica klase, ali moe da pristupi njenim private
i protected lanovima

Objektno orijentisano programiranje

14

Prijateljske funkcije
Prijateljska funkcija se deklarie unutar deklaracije

klase, navoenjem specifikatora friend ispred


deklaracije
Ime prijateljske funkcije nije u oblasti vaenja klase,
pa se prijateljska funkcija ne poziva pomou
operatora pristupa lanu (->), osim ako nije lanica
neke druge klase

Objektno orijentisano programiranje

15

Prijateljske funkcije

Objektno orijentisano programiranje

16

Prijateljske funkcije
Koncept prijateljske funkcije nije krenje principa

kapsuliranja podataka
o Deklaracija kojom se neka funkcija proglaava
prijateljskom moe se nai iskljuivo unutar
deklaracije klase, tj. deo je interfejsa same klase
Prijateljstvo se poklanja, jer je projektant klase taj
koji dozvoljava pristup privatnim lanovima te klase
Prijateljstvo se ne otima, jer nema naina da se
izvan deklaracije klase neka funkcija proglasi
prijateljem
Objektno orijentisano programiranje

17

Prijateljske klase
Ako je potrebno da sve funkcije lanice neke klase
Y budu prijateljske funkcije klasi X, onda se klasa Y
deklarie kao prijateljska klasa (friend class) klase
X:

Prijateljstvo se ne nasleuje
Prijateljstvo nije tranzitivna relacija
Objektno orijentisano programiranje

18

Konstruktori i destruktori
Izvedene klase nasleuju sve funkcije lanice

osnovne klase osim konstruktora, konstruktora


kopije, destruktora i operatora dodele (=)
Prijateljstvo se takoe ne nasleuje
Zbog toga se ove specijalne funkcije lanice moraju
definisati za svaku izvedenu klasu
Kada osnovna klasa ima konstruktor, on se mora
eksplicitno pozvati sintaksom
izvedeni_konstruktor(lista_argumenata) : osnovni_konstruktor
(lista_argumenata); { //telo izvedenog konstruktora }

Objektno orijentisano programiranje

19

Konstruktori i destruktori
Konstruktor osnovne klase prvo kreira osnovni
podobjekat, pa zatim konstruktor izvedene klase
kreira izvedeni deo objekta
o

To ima smisla jer osnovna klasa ne moe da pristupi


elementima u izvedenoj klasi, niti zna za njeno
postojanje

Kada se objekat unitava, prvo se poziva destruktor

izvedene klase, a zatim destruktor osnovne klase


Konstruktori se pozivaju u redosledu izvoenja, a
destruktori u obrnutom smeru
Objektno orijentisano programiranje

20

Konstruktori i destruktori

Objektno orijentisano programiranje

21

Viestruko nasleivanje
Klasa moe da nasledi nekoliko osnovnih klasa;
tada svaki objekat izvedene klase nasleuje sve
lanove svih svojih osnovnih klasa
o

Na primer, motocikl sa prikolicom je jedna vrsta motocikla,


ali i jedna vrsta vozila sa tri toka
Pri tom, motocikl nije vrsta vozila sa tri toka, niti je vozilo
sa tri toka vrsta motocikla, ve su to dve razliite klase

Izvedena klasa se viestruko izvodi tako to se u


zaglavlju njene deklaracije navode imena osnovnih
klasa razdvojena zarezima

Objektno orijentisano programiranje

22

Pokazivai na objekte izvedenih klasa


Po pravilu, pokaziva na jedan tip ne moe da

pokazuje na podatak drugog tipa


Pokazivai na objekte osnovne i izvedene klase
su vaan izuzetak od ovog pravila
U jeziku C++, pokaziva na objekat osnovne klase
moe se koristiti i kao pokaziva na objekat bilo koje
klase koja je izvedena iz te osnovne klase
Obrnuto ne vai: objektu osnovnog tipa ne moe se
pristupiti preko pokazivaa na izvedeni tip
Isto vai i za reference
Objektno orijentisano programiranje

23

Pokazivai na objekte izvedenih klasa


Svojstvo da se pokaziva na osnovnu klasu moe
koristiti i kao pokaziva na izvedenu klasu je
fundamentalno svojstvo jezika C++ kojim se
ostvaruje polimorfizam

Objektno orijentisano programiranje

24

Virtuelne funkcije
Osnova za polimorfizam u jeziku C++ su

nasleivanje i pokazivai na osnovnu klasu


Polimorfizam se realizuje pomou virtuelnih funkcija
Virtuelna funkcija lanica deklarie se u osnovnoj
klasi navoenjem rei virtual, a nadjaava se
(override) u svim izvedenim klasama
o

Svaka izvedena klasa ima sopstvenu verziju virtuelne


funkcije
Izvedena klasa moe, ali i ne mora definisati svoju verziju
virtuelne funkcije
Objektno orijentisano programiranje

25

Virtuelne funkcije
Na prvi pogled, ini se da je nadjaavanje virtuelne
funkcije u izvedenoj klasi specijalan oblik
preklapanja funkcija (overloading), ali nije tako!
o

Za razliku od preklapanja, povratni tipovi, broj i tip


argumenata virtuelne funkcije u osnovnoj i izvedenim
klasama moraju da budu identini
Ako se prototipovi ovih funkcija razlikuju, onda se ne radi o
nadjaavanju (overriding), ve o preklapanju (overloading),
pa je virtuelna priroda funkcije izgubljena

Virtuelna funkcija mora da bude lanica klase,


ili prijateljska funkcija druge klase
Objektno orijentisano programiranje

26

Polimorfizam
Klasa koja sadri virtuelnu funkciju zove se

polimorfna klasa
ta se deava kada se za poziv virtuelne funkcije
koristi pokaziva na objekat osnovne klase?
C++ odreuje koju e (nadjaanu) virtuelnu funkciju
pozvati na osnovu tipa objekta na koji pokazuje
pokaziva, a ne na osnovu tipa pokazivaa
Ova odluka donosi se tokom izvravanja programa
i zato se zove dinamiko vezivanje (dynamic binding)
Objektno orijentisano programiranje

27

Polimorfizam

Objektno orijentisano programiranje

28

Polimorfizam
Polimorfizam je svojstvo da svaki objekat izvedene

klase izvrava metod tano onako


kako je to definisano u njegovoj izvedenoj klasi,
ak i kada mu se pristupa kao objektu osnovne klase
Osnovna klasa diktira interfejs koji e imati svi objekti
izvedeni iz nje, ali ostavlja izvedenim klasama
da definiu stvarni metod koji e implementirati
taj interfejs
o

Odatle fraza jedan interfejs, vie metoda koja se esto


koristi za opisivanje polimorfizma
Objektno orijentisano programiranje

29

Polimorfizam
Polimorfizam omoguuje razdvajanje interfejsa i
implementacije
o
o

Korisno za razvoj biblioteka klasa


Objektima izvedenim iz osnovne klase pristupae se na isti
nain, mada e se operacije razlikovati od klase do klase

Ako se za neku klasu predvia izvoenje, a naroito


ako ima virtuelne funkcije, argumente tipa te klase u
sve funkcije treba prenositi preko referenci
(ili pokazivaa), jer se time obezbeuje polimorfizam

Objektno orijentisano programiranje

30

Apstraktne klase
ista virtuelna funkcija je ona koja nema definiciju

u osnovnoj klasi, ve je izvedene klase konkretizuju


(definiu)
Deklarie se u osnovnoj klasi na sledei nain:
virtual tip ime_funkcije(lista_argumenata) = 0;

Klasa koja sadri barem jednu istu virtuelnu

funkciju zove se apstraktna klasa


Apstraktna klasa ne moe imati objekte
o

Ali mogu da postoje pokazivai na tip apstraktne klase,


ime se ostvaruje polimorfizam

Objektno orijentisano programiranje

31

Virtuelni destruktor
Konstruktor je funkcija koja od obine gomile u

memoriji pravi ivi objekat


Poziva se pre nego to je objekat kreiran, pa nema
smisla da bude virtuelan, to C++ ni ne dozvoljava
Kada se objekat kreira, njegov tip je uvek poznat,
pa je odreen i konstruktor koji se poziva
Destruktor pretvara ivi objekat u hrpu bitova
u memoriji
Destruktor moe biti virtuelan
Objektno orijentisano programiranje

32

Virtuelni destruktor
Virtuelni mehanizam, tj.dinamiko vezivanje tano

odreuje koji destruktor (osnovne ili izvedene klase)


e biti prvo pozvan kada se objektu pristupa
posredno, preko pokazivaa
Ako neka osnovna klasa ima neku virtuelnu funkciju,
onda i njen destruktor treba da bude virtuelan

Objektno orijentisano programiranje

33

Virtuelni destruktor

Objektno orijentisano programiranje

34

RTTI(Runtime Type Identification)


U polimorfnim jezicima kakav je C++ postoje

sluajevi kada je tip objekta nepoznat tokom


kompajliranja jer postaje poznat tek u trenutku
izvravanja
Nije uvek mogue unapred znati na koji tip objekta
pokazuje pokaziva na osnovnu klasu
Da bi se saznao tip objekta, koristi se operator
typeid
o
o

Mora se ukljuiti zaglavlje <typeinfo>


Najee se koristi u obliku typeid(objekat)
Objektno orijentisano programiranje

35

typeid
typeid vraa referencu na objekat tipa type_info

koji opisuje tip objekta


Najvanija upotreba operatora typeid je kada se
primenjuje preko pokazivaa na polimorfnu osnovnu
klasu (tj. na klasu koja ima barem jednu virtuelnu
funkciju)
U tom sluaju typeid tokom izvravanja moe da
prepozna stvarni tip objekta na koji pokazuje
pokaziva na osnovnu klasu
Ako se typeid primenjuje na pokaziva nepolimorfne
klase, vraa pokaziva na osnovnu klasu
Objektno orijentisano programiranje

36

typeid

Objektno orijentisano programiranje

37

typeid

Objektno orijentisano programiranje

38

You might also like