Sunteți pe pagina 1din 44

LECTOR ADRIAN RUNCEANU

Programare orientat
pe obiecte
Universitatea Constantin Brncui din Trgu-Jiu
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
2
Curs 8
Polimorfism
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
3
Polimorfismul este legat de motenire.
Considerm o clasa O1 care conine o metod
M1 care o apeleaz pe alta M2 din aceeai clas.
O alt clas O2 o motenete pe prima. n cadrul
acesteia redefinim metoda M2, dar nu redefinim
metoda M1.
Declarm un obiect de tip O2 i apelm metoda
M1.
Problema este urmtoarea: care va fi metoda
apelat de M1, M2 din O1 sau M2 din O2 ?
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
4
class O1
{
metoda M2 {.}
metoda M1 { metoda M2 ; }
};
class O2: public O1
{
metoda M2 { redefinit }
};
int main()
{
O2 obiect;
Obiect.M1;
}
n situaia de mai sus va fi apelat metoda M2 din O1.
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
5
Exemplu:
Considerm urmtorul mod care
evideniaz situaia precedent:
metoda care() apeleaz metoda tip(),
redefinit.
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
6
#include<iostream.h>
class unu{
public:
void care()
{ tip() ; }
void tip()
{ cout<<"unu\n"; }
};
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
7

class doi : public unu
{
void tip()
{ cout<<"doi\n"; }
};

Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
8

int main()
{
unu x;
doi y;
x.care();
y.care();
}
Rezultatul executiei este:
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
9
n acest moment apare ntrebarea:

De ce am mai redefinit o funcie
(metod) n noua clas care motenete clasa
de baz, dac nu putem folosi funcia
(metoda) redefinit i o apelm tot pe cea
veche ?
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
10
O astfel de metod de selecie a metodei prin
obiectul care o apeleaz se numete selecia
static.

Codul de apel al funciei este obinut
la compilare i rmne nemodificat
pe parcursul executrii programului.
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
11
Soluia rezolvrii unei astfel de probleme
este s se fac selecia n momentul apelului
(i nu la compilare).
n astfel de cazuri programatorul trebuie s
decid momentul n care metoda s fie
selectat.
O astfel de selecie se numete selecie
dinamic sau virtual.
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
12
Pentru a realiza selecia virtual
trebuie s procedm astfel:
1. cnd se declar n cadrul clasei de baz, o
metod ce va redefinit, se adaug dup
declaraie cuvntul virtual
2. orice redefinire a metodei, n cadrul
claselor derivate, se va face utiliznd
acelai cuvnt cheie virtual
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
13

Exemplul anterior se modific
corespunztor prin adugarea cuvantului
cheie virtual, att n cadrul clasei de baz
unu, ct i n cadrul clasei derivate doi.
Rezultatul obinut este urmtorul:
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
14
#include<iostream.h>

class unu{
public :
void care()
{ tip() ; }
virtual void tip()
{ cout<<"unu\n"; }
};
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
15

class doi : public unu
{
virtual void tip()
{ cout<<"doi\n"; }
};
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
16

int main()
{
unu x;
doi y;
x.care();
y.care();
}
Rezultatul execuiei este:
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
17
La cursul de Proiectarea algoritmilor
am nvat despre metoda backtracking
standardizat.
Am observat acolo c metoda n sine const
dintr-o unic secven de instruciuni care
apela diferite funcii care aveau ntotdeauna
acelai nume, dar care se modificau de la un
program la altul.
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
18

Vom ncerca acum, s construim o clas
n care funciile init(), am_succesor() i
celelalte s fie definite iniial cu valori simple,
iar apoi n clasele derivate s poat fi
redefinite astfel nct s rezolve fiecare
problem n parte.
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
19

Dificultatea const n faptul c funcia
run() care conine algoritmul de
backtracking va apela funciile init(),
succesor(), .a.m.d. i deci obiectul care o
folosete trebuie s conin i aceste funcii.
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
20
De aceea ele vor fi definite din start n
clasa de baz ca fiind virtuale, pentru ca
apoi n clasele derivate s poat fi redefinite
corespunztor fiecarei clase n parte care
rezolv un anumit tip de problem.

Deci, vom aplica polimorfismul.
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
21
Iniial n fiierul cu numele back.cpp, vom
declara clasa bkt, n care funciile init(),
am_succesor(), e_valid(), solutie() si
tipar() vor fi declarate virtuale.
Deoarece ele nu vor fi niciodat apelate n
cadrul acestei clase, vor avea corpul vid.
De asemenea, variabilele n, k, as, ev se
gsesc n orice program backtraking si deci,
vor fi declarate aici.
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
22
Fiierul back.cpp conine clasa bkt:

class bkt
{
public:
int st[10],n,k;
virtual void init() {}
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
23

virtual int am_succesor(){ return 0; }
virtual int e_valid() { return 0; }
virtual int solutie() { return 0; }
virtual void tipar() {}
void bkt::run();
};
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
24
void bkt::run()
{
int as;
k=1;
init();
while(k>0)
{
do{
}while( (as=am_succesor()) && !e_valid() );
if(as)
if(solutie()) tipar();
else
{ k++; init(); }
else k--;
}
}
O aplicaie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
25
Exemple de probleme care pot fi rezolvate
acum prin utilizarea clasei bkt, prin
polimorfism:

1. Generarea permutrilor

Se cere s se genereze toate permutrile
mulimii {1,2,,n}.
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
26
Pentru a folosi clasa bkt vom defini o
alta clas, care o motenete pe aceasta i
care va avea funciile clasei iniiale, dar
redefinite.

Vom folosi un constructor care va avea
rolul de a citi valoarea lui n.
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
27
Fiierul perm.cpp va defini clasa
permut care va fi derivat din clasa bkt:

#include<iostream.h>
#include "back.cpp"
class permut : public bkt
{
public:
permut (int v) { n=v; }
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
28

virtual void init();
virtual int am_succesor();
virtual int e_valid();
virtual int solutie();
virtual void tipar();
};
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
29
void permut::init()
{ st[k]=0; }

int permut::am_succesor()
{
if(st[k]<n){ st[k]++; return 1; }
else return 0;
}
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
30

int permut::e_valid()
{
for(int i=1; i<k; i++)
if( st[i] == st[k] ) return 0;
return 1;
}
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
31
int permut::solutie()
{ return (k==n); }

void permut::tipar()
{
for(int i=1;i<=k;i++)
cout<<st[i]<<" ";
cout<<"\n";
}
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
32
Se observ c acest fiier la fel ca i cel
anterior nu are funcie main(), deoarece
poate fi folosit n orice alt program care
rezolv probleme de generarea permutrilor.

i anume poate fi folosit n urmtorul fiier
care afieaz rezultatul generrii
permutrilor mulimii {1,2,,n}:
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
33
#include<iostream.h>
#include "perm.cpp"

int main()
{
permut x(3);
x.run();
}
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
34
Rezultatul execuiei este:

O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
35
2. Problema celor n regine(dame)

Se cere s se genereze toate posibilitile
de aezare a n dame pe o tabl de ah de
dimensiune n*n, astfel n ct s nu se atace
reciproc.
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
36
Dup cum tim, rezolvarea problemei difer
de generarea permutrilor doar printr-o
singur metod: e_valid().

Atunci, vom redefini aceast metod din
clasa permut, pentru a putea obine soluia
dorit:
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
37
Fiierul regine.cpp va conine clasa dame
care va fi derivat din clasa permut:
#include<math.h>
#include "perm.cpp"

class dame : public permut{
public:
dame(int v) : permut(v) {};
virtual int dame::e_valid();
};
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
38

int dame::e_valid()
{
for(int i=1; i<k; i++)
if( ( st[i] == st[k] ) || abs( st[k] -
st[i] ) == abs(k - i) ) return 0;
return 1;
}
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
39
Iar acum pentru scrierea programului care
rezolva problema celor n regine vom
construi fiierul dame.cpp n care vom
include fiierul regine.cpp:

Codul surs al programului este:
O aplicatie a polimorfismului
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
40
#include<iostream.h>
#include "regine.cpp"

int main()
{
dame x(7);
x.run();
}
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
41
Rezultatul execuiei este:

11.11.2012
Curs - Programare orientat pe obiecte C++/Java
42
Probleme propuse spre rezolvare:

1. Pornind de la clasa de baz bkt (din fiierul
back.cpp), s se implementeze, prin polimorfism
clasa virtual ture pentru a rezolva problema turelor:
Se cere s se genereze toate posibilitile de aezare a
n ture pe o tabl de ah de dimensiune n*n, astfel n
ct s nu se atace reciproc.
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
43
Probleme propuse spre rezolvare:
2. Pornind de la clasa de baz bkt (din fiierul
back.cpp), i clasa derivat permut (din fiierul
perm.cpp), s se implementeze, prin polimorfism clasa
virtual cuvinte pentru a rezolva urmtoarea problem:
Se d o mulime alctuit din n litere distincte. Se cer
toate cuvintele care se pot forma cu ele, astfel nct
fiecare cuvnt s conin n litere distincte.
Exemplu: Dac avem mulimea {a,b,c}, atunci vom avea
cuvintele: abc, acb, bac, bca, cab, cba.
Polimorfism
11.11.2012
Curs - Programare orientat pe obiecte C++/Java
44
ntrebri?

S-ar putea să vă placă și