Documente Academic
Documente Profesional
Documente Cultură
Polimorfism
Obiective
Termeni cheie
LECTIA 6
Ob1
m
m
x Ob2
m .
.
.
Obn
A Observatie
A Observatie
Functii virtuale
A Observatii
#include <iostream.h>
class Forma2D {
double dim1, dim2;
public:
void initializare(double a1, double a2)
{
dim1 = a1; dim2 = a2;
}
virtual double aria()
{
cout<<"\n Functie care trebuie redefinita";
return 0.0;
}
void preiaDim(double &d1, double &d2)
{
d1 = dim1; d2 = dim2;
}
};
void main()
{
Forma2D *ob1;
Dreptunghi ob2;
Triunghi ob3;
ob2.initializare(2.8, 1.5);
ob3.initializare(3.2, 5.2);
ob1 = &ob2;
cout << "\n Aria dreptunghiului = " << ob1->aria();
ob1 = &ob3;
cout << "\n Aria triunghiului = " << ob1->aria();
Clase abstracte
Exemplu:
A Observatie
#include <iostream.h>
// clasa abstracta
class Forma2D {
double dim1, dim2;
public:
void initializare(double a1, double a2)
{
dim1 = a1; dim2 = a2;
}
void main()
{
Forma2D *ob1;
Dreptunghi ob2;
Triunghi ob3;
ob2.initializare(2.8, 1.5);
ob3.initializare(3.2, 5.2);
ob1 = &ob2;
cout << "\n Aria dreptunghiului = " << ob1->aria();
ob1 = &ob3;
cout << "\n Aria triunghiului = " << ob1->aria();
}
A Observatie
class <nume_clasã_abstractã> {
// …
public:
//…
virtual <tip_functie> <nume_functie> ([<lp>]) = 0;
//…
};
Polimorfism
#include <iostream.h>
class A1 {
public:
// defineste o functie virtuala
virtual int valoare()
{ return 1; }
};
class A2 : public A1 {
public:
// redefineste functia virtuala din clasa A1
virtual int valoare()
{ return 2; }
};
void main()
{
A1 ob1;
A1 *ptr=&ob1;
A2 ob2;
• Nume
• Lista cu tipurile parametrilor
class Punct
{
int x, y;
public:
Punct(int, int);
//...
};
class ObiectGrafic
{
protected:
Punct centru;
ObiectGrafic(Punct const& a):
centru(a) {}
public:
virtual ~ObiectGrafic();
virtual void Deseneaza() const=0;
};
void main()
{
//...
Cerc c(Punct(0,0),3);
c.Deseneaza();
//...
}
#include <iostream.h>
#include <string.h>
#include <assert.h>
Persoana::Persoana(char* P, char* N)
{
prenume = new char[strlen(P)+1];
assert(prenume!=0);
strcpy(prenume, P);
Persoana::~Persoana()
{
delete prenume;
delete nume;
}
char* Persoana::preiaPrenume()
{
return prenume;
}
char* Persoana::preiaNume()
{
return nume;
}
void Persoana::afisare()
{
cout << prenume << " " << nume << "\n";
}
void Student::seteazaBursa(double B)
{
bursa = B>0?B:0;
}
void Student::seteazaMedia(double M)
{
media = M>0?M:0.0;
}
double Student::venit()
{
return bursa;
}
void Student::afisare()
{
cout << "\n Student:";
Persoana::afisare();
cout << "\t Media = " << media << "\n";
}
void Salariat::seteazaSalariu(double S)
{
salariu = S>0 ? S : 0;
}
void Salariat::seteazaVenitOra(double V)
{
venit_ora = V>0.0 ? V : 0.0;
}
double Salariat::venit()
{
return salariu + nr_ore*venit_ora;
}
void Salariat::afisare()
{
cout << "\n Salariat:";
Persoana::afisare();
}
void main()
{
Student S1("Alexandra", "Stoica", 1500000, 10);
cout << "\n Legare statica:\n";
S1.afisare();
cout << " venit (lei) "<<S1.venit();
cout << "\n Legare dinamica:\n";
Ref_Pointer(&S1);
Ref_Referinta(S1);
A Observatii
Rezumat
Notiuni fundamentale
Functii virtuale
Polimorfism
Clase abstracte
Polimorfism pur
Supraîncãrcare
Variabile polimorfice
Obiecte polimorfice
Functii polimorfice
Teste de autocontrol
4.3 Cum se numeste o clasã care contine una sau mai multe
functii virtuale pure?
(a) staticã
(b) timpurie
(c) nulã
(d) dinamicã
Exercitii