You are on page 1of 7

3.12.2018.

Osnovne teme

nasljeđivanje
zaštićeni pristupi i kako se koriste
polimorfizam

Objektno-orijentirano programiranje
u programskom jeziku C++

3.12.2018. 1 3.12.2018. 2

Hijerarhija - nasljeđivanje OOP nasljeđivanje


Mnoge klase imaju zajednička svojstva - Nasljeđivanje omogućava ponovno korištenje koda i pridruživanje
> mogu biti uređene u hijererhiju
podataka i funkcionalnosti bez promjene postojećeg koda.
Hijerahija ostvaruje JE (“is a”) relaciju.
primjer:
Pas JE Sisavac / Pas “is a” Sisavac Nasljeđivanje je odnos između klasa kod kojeg se jedna klasa stvara na
Sisavac JE Životinja / Sisavac “is a” Animal temelju druge tako da joj se dodaju specifični atributi i ponašanje
Koncept na nižoj razini hijerarhije
nasljeđuje, (automatski preuzima) sva Objekti mogu naslijediti svojstva drugih objekata (kao što djeca
svojstva svoje nadklase na višoj razini nasljeđuju obilježja / svojstva svojih roditelja).
hijerarhije.

Što podrazumijevamo pod izjavom: klasa Kada se nasljeđuje klasa, nasljeđuju se sve njene dostupne funkcije i
A je vrsta klase B?
podatkovni članovi bez obzira hoće li ih izvedena klasa koristiti:
Podrazumijevamo da je klasa A
protected/public članovi bazne klase su dostupni izvedenoj klasi
specifikacija klase B
Npr. klasa Pas u definiciju Sisavca dodaje private članovi nisu dostupni izvedenoj klasi.
nova svojstva (lajanje, mahanje repom)
3.12.2018. 4

Koncepti u nasljeđivanju Sintaksa nasljeđivanja


Podklase = Izvedene klase: Sintaksa izvođenja nove klase (podklase) iz postojeće klase (nadklase,
su specijalizacije svojih nadklasa ( = baznih klasa) = dodaje novu bazne klase):
funkcionalnost postojećoj klasi
class NazivKlase : vrsta_pristupa Nadklasa { … }
kaže se da su izvedena iz bazne (originalne) klase
vrsta_pristupa = { public, private, protected }
Nadklasa = Bazna klasa: Primjer: class Pas : public Sisavac;
Za originalnu klasu kaže se da je bazna klasa nove izvdene klase.
Bazna klasa (Sisavac) mora biti već deklarirana !
npr. Sisavac je bazna klasa klase Pas jer se Pas izvodi iz klase Sisavac.
najčešće imaju više (od 1) izvedenih klasa

Apstraktna klasa:
Bazna klasa koja nema instance
nema implementaciju

3.12.2018. 6

OOP – C++, M. Ivašić-Kos 1


3.12.2018.

Primjer Mogućnosti pristupa kod javnog nasljeđivanja


enum PASMINA { OVCAR, PUDLA,
class Sisavac { DOBERMAN, LABRADOR};
mogućnosti pristupa kod javnog nasljeđivanja (public inheritance):
public: Podklasa može pristupiti javnim članovima nadklase
Sisavac(); Dodatno, podklasa može pristupiti zaštićenim (“protected”) članovima
~Sisavac(); class Pas : public Sisavac{ nadklase. (oni nisu dostupni drugim korisnicima te klase (nadklase))
int GetGod() const; public:
Podklasa ne može pristupiti privatnim članovima nadklase.
void SetGod(int); Pas();
Podklasa može pristupiti zaštićenim članovi nadklase koja joj nije neposredna
int GetTezina() const; ~Pas();
PASMINA GetPasmina() const;
nadklasa ukoliko sve klase u hijerarhiji koriste javno nasljeđivanje
void SetTezina();
void GlasaSe() const; void SetPasmina(PASMINA);
void Spava() const; lovackiPas(); primjer: klasa Pas javno nasljeđuje od klase Sisavac:
protected: protected: void main() {
int iGod; PASMINA pPasmina; Pas Fido;
int iTez; }; Fido.GlasaSe(); //fija definirana u nadklasi Sisavac
}; Fido.lovackiPas(); // fija iz klase Pas
cout << “Fido ima “ << Fido.GetGod() << “ godina \n”; //fija iz Sisavac
}
3.12.2018. 7 3.12.2018. 8

Primjer 2: Ponovno korištenje postojećeg koda Ponovno korištenje postojećeg koda


Class Zaposlenik Class Direktor Napravljen je nepotreban posao da se kreira Direktor, koji je sličan
class Zaposlenik { class Direktor { Zaposlenik.
public: public: Direktor je (“is a") Zaposlenik.
Zaposlenik(string pime, float pplaca); Direktor(string pime, float pplaca, int n); Rješenje je korištenje OO koncepta nasljeđivanja (inheritance).
string GetIme() const; void SetRukovodi(int n);
Princip nasljeđivanja:
float GetPlaca() const; string GetIme() const;
Podklasa (Direktor) nasljeđuje od nadklase (Zaposlenik).
float izracun_place(float radnihSati) const; float GetPlaca() const;
Podklasa (Direktor) nakon nasljeđivanja dobiva sve podatkovne članove i
protected: float izracun_place(float radnihSati) const;
funkcionalnost nadklase (Zaposlenik).
string ime; protected:
Moguće je dodati nove funkcije i podatkovne članove potrebne podklasi (Direktor) i
float placa; string ime; redefinirati svaku funkciju naslijeđenu od nadklase koja se razlikuje u podklasi.
}; float placa;
int rukovodi_n_zaposlenika;
Nasljeđivanje stvara hijerarhiju povezanih klasa koje dijele sučelje i
};
implementaciju.

3.12.2018. 9 3.12.2018. 10

Primjer 2: Ponovno korištenje postojećeg koda Primjeri nadklasa-podklasa:


Direktor:
class Direktor : public Zaposlenik { // is a relacija Bazna Klasa – nadklasa Izvedena klasa - podklasa
public: Pred-diplomant
Direktor(string pime, float pplaca, int n); Student Diplomant
void SetRukovodi(int n); Post-diplomant
protected: Krug
int rukovodi_n_zaposlenika; Trokut
Geomtrijski Lik
}; Pravokutnik
Trapez
Funkcije Direktor imaju pravo pristupa podatkovnim članovima nadklase Zaposlenik koji Motor
su deklarirani kao “protected” (ime, placa). Auto
Cestovno Vozilo
Kamion
Autobus

3.12.2018. 11 3.12.2018. 12

OOP – C++, M. Ivašić-Kos 2


3.12.2018.

Primjer nasljeđivanja Konstruktori i destruktori


class Vozilo{
Objekti podklase su i objekti nadklase
protected:
Objekti klase Pas su ujedno objekti klase Sisavac .
char boja[20];
int brojKotaca; Kada se kreira podklasa, najprije je pozvan odgovarajući bazni konstruktor
Nadklasa ili bazna klasa
public: iz nadklase, a zatim konstruktor same podklase.
Vozilo(); Ukoliko konstruktori nisu definirani, pozivaju se podrazumijevani konstruktori.
~Vozilo(); Kod uništavanja objekta podklase, najprije se poziva destruktor podklase,
void start(); (npr. Pas), a zatim destruktora nadklase (Sisavac).
void stop();
redoslijed izvođenja:
void vozi();
1. konstruktor nadklase kreiranje objekta podklase
};
class Auto: public Vozilo{ 2. konstruktor podklase
protected: ….
char vrstaGoriva; Podklasa ili izvedena klasa
1. destruktor podklase uništavanje objekta podklase
public:
Auto(); 2. destruktor nadklase
}; 3.12.2018. 13

Konstruktori izvedene klase Konstruktori izvedene klase - definicija


Pas::Pas(){
prilikom inicijalizacije izvedene klase poziva odgovarajući konstruktor Sisavac:: Sisavac();
bazne klase. pPasmina= OVCAR;
primjer: }
Pas::Pas(int god) {
class Sisavac { class Pas : public Sisavac {
Sisavac:: Sisavac(god); // odgovarajući konstruktor nadklase
protected: private:
int iGod; PASMINA pPasmina; pPasmina= OVCAR;
int iTez; public: }
public: // konstruktori, destruktori
// konstruktori, destruktori Pas(); Napraviti za:
Sisavac(){ Pas(int god);
Pas(int god, int tez);
iGod = 1; Pas(int god, int tez);
iTez = 5; } Pas(int god, PASMINA pasmina); Pas(int god, PASMINA pasmina);
Sisavac(int god){ Pas(int god, int tez, PASMINA pasmina); Pas(int god, int tez, PASMINA pasmina);
iGod = god; ~Pas();
iTez = 5;} …
~Sisavac() {} };

};

Konstruktori izvedene klase - definicija Konstruktori izvedene klase - 2 načina definiciranja


Pas::Pas(){ Pas::Pas(){ Pas::Pas():Sisavac(), pPasmina(OVCAR) {}
Sisavac:: Sisavac(); Sisavac:: Sisavac();
pPasmina= OVCAR; pPasmina= OVCAR;
} }
Pas::Pas(int god) { Pas::Pas(int god) { Pas::Pas(int god):Sisavac(god), pPasmina(OVCAR) {}
Sisavac:: Sisavac(god); // odgovarajući konstruktor nadklase Sisavac:: Sisavac(god);
pPasmina= OVCAR; pPasmina= OVCAR;
} }
Pas::Pas(int god, int tez) { Pas::Pas(int god, int tez) { Pas::Pas(int god, int tez): Sisavac(god),
Sisavac:: Sisavac(god); // nadklasa nema konstruktora s 2 paramatre, poziva se s jednim! Sisavac:: Sisavac(god); pPasmina(OVCAR) {
pPasmina= OVCAR; pPasmina= OVCAR; iTez = tez;
iTez = tez; iTez = tez; }
} }
Pas::Pas(int god, int tez, PASMINA pasmina){ Pas::Pas(int god, int tez, PASMINA pasmina){ Pas::Pas(int god, int tez, PASMINA pasmina):
Sisavac:: Sisavac(god); Sisavac:: Sisavac(god); Sisavac(god), pPasmina(pasmina) {
pPasmina= pasmina; pPasmina= pasmina; iTez = tez;
iTez = tez; iTez = tez; }
} }

OOP – C++, M. Ivašić-Kos 3


3.12.2018.

Poziv odgovarajućeg konstruktora Polimorfizam


Pas::Pas():Sisavac(), pPasmina(OVCAR) {} Bazna klasa Oblik definira sučelje za sve podklase koje će od nje
int main(){ nasljeđivati ponašanje i svojstva. Oblik
Pas Fido; Npr. Svi oblici mogu biti nacrtani i izbrisani
Pas Winni(5);
Pas::Pas(int god):Sisavac(god), pPasmina(OVCAR) {} funkcije: crtaj() i brisi()
Pas Lira(6,8); Geom. Lik Geom. Tijelo
Pas Aga (4,20,DOBERMAN);
Fido.GlasaSe(); Krug Kvadrat Trokut Kugla Kocka
Winni.lovackiPas(); Pas::Pas(int god, int tez): Sisavac(god),
pPasmina(OVCAR) {
cout << “Težina Age je “;
iTez = tez;
cout << Aga .GetTezina() << “ kg \n”; Nadjačavanje: Podlasa proširuje (specijalizira) ponašanje svoje nadklase.
}
return 0; Korištenje funkcija i operatora na različite načine ovisno o operandima
}
Pas::Pas(int god, int tez, PASMINA pasmina): (objektima) nad kojima operiraju zove se polimorfizam.
Sisavac(god), pPasmina(pasmina) {
Polimorfizam omogućava različite implementacije metoda u izvedenim
iTez = tez;
klasama.
}
Kugla i Kocka imaju istu funkciju crtaj() sa različitom funkcionalnošću koja omogućuje
korektnu primjenu metode u odgovarajućoj klasi.
3.12.2018. 20

Nadjačavanje funkcija nadklase Primjer: Nadjačavanje funkcija nadklase


Podklasa može nadjačati (overriding) funkcije nadklase - > Ako je u klasi Pas definirana ista funkcija kao i u
class Sisavac {
nadklasi Sisavac, funkcija pozvana nad objektom iz
u podklasi je izmijenjena implementacija funkcije nadklase (funkcija public: klase Pas nadjačati će i sakriti istu funkciju
nadklase prilagođena je podklasi). // konstruktori definiranu u klasi Sisavac.
//funkcije
Da bi se nadjačala funkcija nadklase potrebno je u podklasi definirati void GlasaSe() const { cout << “Glasanje sisavca!\n”; }
funkciju koja će po svojoj deklaraciji u potpunosti odgovarati metodi (s void Spava() const { cout << “shhh. Spavam.\n”; }
int main(){
Sisavac sis;
istim povratnim tipom i potpisom funkcije). … Pas Fido;
Potpis je prototip funkcije koji uključuje: ime, lista parametara i ključna riječ const, };
(ako postoji). class Pas : public Sisavac{ sis.GlasaSe();
public: Fido.GlasaSe();
return 0;
Prilikom pozivanja funkcija, najprije se provjerava postoje li one u // konstruktori
}
// funkcije
podklasi. Ako postoje, izvršavaju se. Odgovarajuće metode u nadklasi
void MoliZaHranu() const { cout << “Moli za hranu...\n”; }
neće se izvršiti (biti će sakrivene).
void GlasaSe() const { cout << “Woof!\n”; }

};

Preopterećivanje vs. Nadjačavanje: Primjer: Preopterećivanje vs. Nadjačavanje:


kod preopterećivanja funkcija, definira se više funkcija istog imena, ali s class Sisavac{
različitim potpisom (tipom i brojem parametara). public:
void Pomak () const { cout << “Sisavac se pomakao za 1 korak.\n”; }
void Pomak (int udaljenost) const {
Kod nadjačavanja funkcije nadklase, u podklasi se definira funkcija s
cout << “Sisavac se pomakao “ << udaljenost <<” koraka.\n”; int main(){
istim povratnim tipom i potpisom poput funkcije u nadklasi. Sisavac sis;
}
Pas Fido;

Pažnja! }; sis.Pomak();
sis.Pomak(2);
Ako su funkcije u nadklasi preopterećene, nadjačavanje jedne funkcije
class Pas : public Sisavac {
sakriti će i ostale preopterećene funkcije. -> rješenje: potrebno je public: Fido.Pomak();
nadjačati sve preopterećene funkcije. // Možete dobiti poruku da sakrivate funkciju!
// Fido.Pomak(10);
return 0;
void Pomak () const { cout << “Pas se pomakao 5 koraka.\n”; } }
};

OOP – C++, M. Ivašić-Kos 4


3.12.2018.

Pozivanje baznog oblika nadjačane funkcije Primjer: Pozivanje baznog oblika nadjačane funkcije
#include <iostream> using imespace std;
Funkcija nadklase nakon što je nadjačana u podklasi, može se pozvati
prema originalnoj definiciji u nadklasi. class Sisavac{
Sintaksa: public:
void Pomak() const { cout << “Sisavac se pomakao 1 korak\n”; }
Nadklasa::funkcija. void Pomak(int udaljenost) const {
cout << “Sisavac se pomakao “ << udaljenost << “ koraka \n.” ; int main() {
} Sisavac sis;
Pas Fido;
};
Primjer: Sisavac::Pomak().
sis.Pomak(2);
class Pas : public Sisavac {
Fido.Pomak();
public: Fido.Pomak(6);
void Pomak() const { cout << “Pomak u Psu...\n”; } return 0;
void Pomak( int a) const { Sisavac::Pomak(a); } }
};

Primjer: Pozivanje baznog oblika nadjačane funkcije– 2 varijanta Virtualne funkcije


#include <iostream> using imespace std; Veza podklasa “is a” nadklasa znači da:
podklasa nasljeđuje svojstva (podatkovne članove) i ponašanja (funkcije)
class Sisavac{ nadklase
public:
Primjer: Objekt klase Pas nasljeđuje svojstva klase Sisavac
void Pomak() const { cout << “Sisavac se pomakao 1 korak\n”; }
void Pomak(int udaljenost) const {
cout << “Sisavac se pomakao “ << udaljenost << “ koraka \n.” ; int main() { Ali i da pokazivači na nadklasu mogu biti dodijeljeni objektima
Sisavac sis;
} Pas Fido;
podklase.
};
sis.Pomak(2); Primjer: Sisavac * pSisavac = new Pas;
class Pas : public Sisavac { Fido.Pomak(); • kreira se novi objekt klase Pas na gomili,
public: Fido.Sisavac::Pomak(6);
• pokazivač na taj objekt je pridružen klasi Sisavac (njegovoj nadklasi).
void Pomak() const { return 0;
} • pokazivač na Sisavac može pozvati svaku funkciju klase Sisavac, ali cilj je da se
cout << “Pomak u Psu...\n”;
pozivaju odgovarajuće funkcije u podklasama. Virtualne funkcije to omogućuju.
Sisavac::Pomak(1);
} • Poziv odgovarajuće funkcije može biti definiran dinamički (prilikom izvođenja, u
}; run-time) ili statički (prilikom kompajliranja).

Primjer: Virtualne funkcije Primjer: Virtualne funkcije- pokazivača nad različitim objektima podklasa.
#include <iostream> using std::cout;
#include <iostream> using namespace std; Pokazivača na klasu Sisavac pozvan je nad različitim
class Sisavac { objektima podklasa.
class Sisavac {
public: Pozivaju se odgovarajuće funkcije nadjačane u
public:
Sisavac():iGod(1) { cout << “Sisavac konstruktor...\n”; } podklasama.
Sisavac():iGod(1) { } void main() {
virtual ~Sisavac() { cout << “Sisavac destruktor...\n”; } int main() { virtual ~Sisavac() { } Sisavac *pMam ;
void Pomak() const { cout << “Sisavac se pomakao\n”; } Sisavac *pMam = new Pas; void Pomak() const { cout << “Sisavac se pomakao\n”; } pMam = new Pas;
virtual void GlasaSe() const { cout << “Sisavac se glasa!\n”; } pMam ->Pomak(); virtual void GlasaSe() const { cout << “Sisavac se glasa!\n”; } pMam ->Pomak();
protected: pMam ->GlasaSe(); protected: pMam ->GlasaSe();
int iGod; delete pMam; int iGod; pMam = new Macka;
}; return 0; }; pMam ->Pomak();
class Pas : public Sisavac { } class Pas : public Sisavac { pMam ->GlasaSe();
public:
public: delete pMam;
Pas() { cout << “Pas konstruktor...\n”; }
void GlasaSe()const { cout << “Vau! Vau!\n”; } }
virtual ~Pas() { cout << “Pas destruktor...\n”; }
};
void lovackiPas() { cout << “Ovo je lovački pas...\n”; }
class Macka : public Sisavac {
void GlasaSe() const { cout << “Vau! Vau!\n”; }
public:
void Pomak() const { cout << “Pas se pomakao 5 koraka.\n”; }
void GlasaSe( )const { cout << “Miau! Miau!\n”; }
};
};

OOP – C++, M. Ivašić-Kos 5


3.12.2018.

Kako rade virtualne funkcije Kako rade virtualne funkcije


Prilikom kreiranja objekta izvedene klase (npr. objekt klase Pas), najprije Kada je u nekoj klasi kreirana virtualna funkcija, objekt je mora nadjačati.
se poziva konstruktor bazne klase (Sisavac), a zatim izvedene klasu. Mnogi kompajleri rade tablice virtualne funkcije za svaku klasu, (v-table).
Za svaku virtualnu tablicu klase postoji pokazivač (vptr ili v-pointer).

Nadklasa:Sisavac Implementacije virtualnih funkcija se razlikuju, ali svaki kompajler mora


Objekt klasePas postići isto: Svaki objekt s virtualnom funkcijom ima vptr pokazivač koji
Podklasa:Pas pokazuje na odgovarajuću implementaciju virtualne funkcije.

1. poziv
Konstruktor Sisavac
Kreiranje objekta Pas
2. poziv
Konstruktor Pas

Virtualni destruktori Apstraktne klase


Ako je bilo koja funkcija u klasi virtualna, tada i destruktor treba biti Apstraktna klasa je uvijek bazna klasa.
virtualan. Apstraktna klasa ne može imati instance.
Oblik
Primjer (za klasu Sisavac): Pretpostavimo hijerarhiju klasa: Oblik, njene
virtual ~Sisavac() { cout << “ Sisavac destruktor...\n”; } podklase su Geom.Lik i Geom.Tijelo.
Geom.Tijelo je nadklasa od Kocke ili Kugle, Geom. Lik Geom. Tijelo
a Geom.Lik, of Kruga, Kvadrat, Trokut.
Ako je destruktor bazne klase virtualan -> bit će pozvan destruktor
Krug Kvadrat Trokut Kugla Kocka
izvedene klase koji će automatski pozvati destruktora bazne klase -> cijeli
objekt će bit uništen.
Apstraktne klasa ima čiste virtualne funkcije (predstavljaju sučelje).
Nadklasa:Sisavac
Čista virtualna funkcija inicijalizirana je s nulom
Objekt klasePas
primjer:
Podklasa:Pas 1. poziv
Destruktor Pas virtual void Crataj() = 0;
Brisanje objekta Pas
2. poziv
Destruktor Sisavac Svaka klasa koja se izvodi iz apstraktnih klasa mora nadjačati virtualnu funkciju.

Primjer: čiste virtualne funkcije Primjer: čiste virtualne funkcije


#include <iostream> using namespace std; int main() {
class Rectangle : public Shape { class Square : public Rectangle {
enum BOOL { FALSE, TRUE }; int choice;
public: public:
class Shape { Rectangle(int len, int width): itsLength(len), itsWidth(width){} Square(int len): Rectangle(len,len) {} BOOL fQuit = TRUE;
public: ~Rectangle(){} Square(int len, int width); Shape * sp;
Shape(){} long GetArea() { return itsLength * itsWidth; } ~Square(){} do {
long GetPerim() {return 2*itsLength + 2*itsWidth; } long GetPerim() {return 4 * GetLength();} cout << "(1)Circle (2)Rectangle (3)Square (0)Quit: ";
~Shape(){}
virtual int GetLength() { return itsLength; } }; cin >> choice;
virtual long GetArea() = 0;
virtual long GetPerim()= 0; virtual int GetWidth() { return itsWidth; } Square::Square(int len, int width): Rectangle(len,width) { switch (choice) {
void Draw(); if (GetLength() != GetWidth()) case 1: sp = new Circle(4);
virtual void Draw() = 0; break;
}; private: cout << "Error, not a square... a Rectangle??\n";
int itsWidth; } case 2: sp = new Rectangle(3,6);
class Circle : public Shape { break;
int itsLength;
public: }; case 3: sp = new Square (3);
Circle(int radius):itsRadius(radius){} void Rectangle::Draw() { Output: (1)Circle (2)Rectangle (3)Square (0)Quit: 2 break;
~Circle(){} for (int i = 0; i<itsLength; i++) { xxxxxx default: fQuit = FALSE;
long GetArea() { return 3 * itsRadius * itsRadius; } for (int j = 0; j<itsWidth; j++) cout << "x "; xxxxxx }
long GetPerim() { return 9 * itsRadius; } cout << "\n"; xxxxxx sp->Draw();
void Draw() {cout << "Circle drawing here!\n“; } } (1)Circle (2)Rectangle (3)Square (0)Quit: 3 } while (fQuit);
private: xxx return 0;
xxx }
int itsRadius;
xxx
}; (1)Circle (2)Rectangle (3)Square (0)Quit: 0
3.12.2018. 35 3.12.2018. 36

OOP – C++, M. Ivašić-Kos 6


3.12.2018.

Kompleksna hijerarhija apstraktnih klasa Primjer: izvedene apstraktne klase


#include <iostream.h> Mammal : public Animal {
Apstraktne klase mogu se izvoditi iz drugih apstraktnih klasa. enum COLOR { Red, Green, Blue, Yellow, public:
U tom slučaju neke izvedene čiste virtualne funkcije mogu se nadjačati i White, Black, Brown };
Mammal(int age):Animal(age){ cout << "Mammal constructor\n";}
impelentirati tako da više nisu čiste vritualne. ~Mammal() { cout << "Mammal destructor...\n";}
virtual void Eat () const { cout << "Mammal eat...\n"; }
Npr. class Animal {
public: virtual void Sleep() const { cout << “Mamal snoring...\n“;}
Neka je dana klasa Animal, sa čisto vritualnim funkcijama Eat(), };
Animal(int age) : itsAge(age) {};
Sleep(), Move(). - virtual ~Animal() { cout << "Animal destructor.\n"; } class Fish : public Animal {
Iz klase Animal izvedene su klase Mammal i Fish. virtual int GetAge() const { return itsAge; } public:
Naslijeđene funkcije mogu u podklasama Mammal i Fish ostati čisto virtual void SetAge(int age) { itsAge = age; } Fish(int age):Animal(age) {
virtual void Sleep() const = 0; cout << "Fish constructor...\n";}
virtualne ili se mogu implementirati.
virtual void Eat() const = 0; virtual ~Fish() {cout << "Fish destructor...\n"; }
Ako se iz klase Mammal izvodi klasa Dog, tada instance ove klase virtual void Move() const = 0; virtual void Sleep() const { cout << "fish snoring...\n“;}
moraju nadjačati i implementirati sve čiste virtualne funkcije koje su virtual void Speak() const = 0; virtual void Eat() const { cout << "fish feeding...\n"; }
naslijedile. private: virtual void Move() const { cout << "fish swimming\n";}
int itsAge; virtual void Speak() const { }
}; };
3.12.2018. 37 3.12.2018. 38

Primjer: izvedene apstraktne klase Primjer: izvedene apstraktne klase


class Dog : public Mammal { void main() {
class Horse : public Mammal {
public: Animal *pAnimal=0;
public:
Dog(int age, COLOR color ): int choice; int quit = 1;
Horse(int age, COLOR color ):
while (quit) { Output: (1)Dog (2)Horse (3)Bird (0)Quit: 1
Mammal(age), itsColor(color) Mammal(age), itsColor(color)
cout << "(1)Dog (2)Horse (3)Fish (0)Quit: "; Animal constructor...
{ cout << "Horse constructor...\n"; } { cout << "Dog constructor...\n"; } Mammal constructor...
virtual ~Dog() { cout << "Dog destructor...\n"; } cin >> choice;
virtual ~Horse() { cout << "Horse destructor...\n"; } Dog constructor...
virtual void Speak()const { cout << "Whoof!.\n"; } switch (choice) { Whoof!...
virtual void Speak()const { cout << "Whinny!... \n"; }
virtual void Move() const { cout << "Dog running.\n“;} case 1: pAnimal = new Dog(5,Brown); Dog running...
virtual COLOR GetItsColor() const { return itsColor; }
break; Dog snoring...
virtual void Move() const { cout << "Horse running.\n";} virtual void Sleep() const { cout << “Dog snoring.\n“;}
case 2: pAnimal = new Horse(4,Black); Mammal eating
protected: protected: Dog destructor...
COLOR itsColor; break; Mammal destructor...
COLOR itsColor;
}; case 3: pAnimal = new Fish (5); Animal destructor...
};
break; (1)Dog (2)Horse (3)Bird (0)Quit: 0
default: quit = 0; }
pAnimal->Speak(); pAnimal->Move();
pAnimal->Sleep(); pAnimal->Eat();
delete pAnimal;
}}
3.12.2018. 39 3.12.2018. 40

Sažetak

kako se implementiora nasljeđivanje u c++


konstruktori kod nasljeđivanja
nadjačavanje metoda nadklase
što je polimorfizam

3.12.2018. 41

OOP – C++, M. Ivašić-Kos 7

You might also like