Programare orientată peobiecte
# 11
Adrian Runceanuwww.runceanu.ro/adrian
2016
C++Probleme recapitulative (partea II)
C++. Probleme recapitulative (exemple)
1. Mostenirea. Proprietati ale mecanismului de mostenire.
In programul urmator se va declara o clasa de baza numita Baza din care vom deriva o clasa numita Derivata1. Din aceasta clasa, Derivata1, se va deriva o alta clasa numita Derivata2.
Acest exemplu isi propune sa scoata in evidenta modul in care sunt apelati constructorii si destructorii atunci cand se foloseste mostenirea.
18.12.2017 P.O.O. - limbajul C++ (laborator) 2
C++. Probleme recapitulative (exemple)
#include <iostream>using namespace std;class Baza{
public : Baza (){
cout<<endl<<"Constructorul Clasei De Baza";}~Baza(){
cout<<endl<<"Destructorul Clasei De Baza";}
};
18.12.2017 P.O.O. - limbajul C++ (laborator) 3
C++. Probleme recapitulative (exemple)
class Derivata1 : public Baza{
public : Derivata1() : Baza(){
cout<<endl<<"Constructorul Primei Clase Derivate";}~Derivata1(){
cout<<endl<<"Destructorul Primei Clase Derivate";}
};
18.12.2017 P.O.O. - limbajul C++ (laborator) 4
C++. Probleme recapitulative (exemple)
class Derivata2 : public Derivata1{
public : Derivata2 (): Derivata1 (){
cout<<endl<<"Constructorul Celei De-a 2-a Clase Derivate";}~Derivata2(){
cout<<endl<<"Destructorul Celei De-a 2-a Clase Derivate";}
};
18.12.2017 P.O.O. - limbajul C++ (laborator) 5
C++. Probleme recapitulative (exemple)
int main(){
Derivata2 *obj ;/* Se declara un pointer la obiect de tip Derivata 2. Derivata2 este o clasa
derivata din Derivata1 care la randul ei este derivata din clasa Baza */
obj = new Derivata2 (); // se instantiaza obiectul
cout<<endl;cout<<"Se apeleaza destructorii in ordinea inversa
constructorilor: " << endl;delete obj; // se distruge obiectul
cout<<endl;return 0;
}
18.12.2017 P.O.O. - limbajul C++ (laborator) 6
C++. Probleme recapitulative (exemple)
Rezultatul executiei programului:
18.12.2017 P.O.O. - limbajul C++ (laborator) 7
C++. Probleme recapitulative (exemple)
2. Urmatorul exemplu isi propune sa evidentiezeapelul constructorilor in cazul mostenirii multiple:
18.12.2017 P.O.O. - limbajul C++ (laborator) 8
C++. Probleme recapitulative (exemple)
#include <iostream>using namespace std;class Baza{
public : Baza (){
cout<<endl<<"Constructorul Clasei De Baza";}~Baza(){
cout<<endl<<"Destructorul Clasei De Baza";}
};18.12.2017 P.O.O. - limbajul C++ (laborator) 9
C++. Probleme recapitulative (exemple)
class Derivata1 : public Baza{
public : Derivata1() : Baza(){
cout<<endl<<"Constructorul Primei Clase Derivate";}~Derivata1(){
cout<<endl<<"Destructorul Primei Clase Derivate";}
} ;
18.12.2017 P.O.O. - limbajul C++ (laborator) 10
C++. Probleme recapitulative (exemple)
class Derivata2 : public Baza{
public : Derivata2() : Baza(){
cout<<endl<<"Constructorul Celei De-a 2-a Clase Derivate";}~Derivata2(){
cout<<endl<<"Destructorul Celei De-a 2-a Clase Derivate";}
};
18.12.2017 P.O.O. - limbajul C++ (laborator) 11
C++. Probleme recapitulative (exemple)
class Derivata3 : public Derivata1, public Derivata2{
public : Derivata3() : Derivata1(), Derivata2(){
cout<<endl<<"Constructorul Celei De-a 3-a Clase Derivate";}~Derivata3(){
cout<<endl<<"Destructorul Celei De-a 3-a Clase Derivate";}
};
18.12.2017 P.O.O. - limbajul C++ (laborator) 12
C++. Probleme recapitulative (exemple)
int main(){
Derivata3 *obj ;obj = new Derivata3(); // se instantiaza obiectul
cout<<endl;cout<<"Se apeleaza destructorii in ordinea inversa
constructorilor: " << endl;delete obj; // se distruge obiectul
cout<<endl;return 0;
}
18.12.2017 P.O.O. - limbajul C++ (laborator) 13
C++. Probleme recapitulative (exemple)
Rezultatul executiei programului:
18.12.2017 P.O.O. - limbajul C++ (laborator) 14
C++. Probleme recapitulative (exemple)
3. Urmatorul program va crea o clasa Cerc din care se va deriva o clasa Sfera.
18.12.2017 P.O.O. - limbajul C++ (laborator) 15
C++. Probleme recapitulative (exemple)
#include <iostream>#include <stdio.h>#include <conio.h>#include <math.h>
using namespace std;
const double PI = 3.14159;
18.12.2017 P.O.O. - limbajul C++ (laborator) 16
C++. Probleme recapitulative (exemple)
class Punct{
private : float x, y, z;public :Punct (void) // Primul Constructor (DEFAULT CONSTRUCTOR)
{x = y = z = 0;
}Punct (float X , float Y ,float Z) // Al doilea Constructor
{x = X;y = Y;z = Z;
}18.12.2017 P.O.O. - limbajul C++ (laborator) 17
C++. Probleme recapitulative (exemple)
void Afisare_Punct(){
cout << endl << " Coordonatele sunt : x = " << x << ", y = " << y << ", z = " <<z ;}
/* in acest mod Clasa Circle va avea acces la membrii privatiai clasei Punct (x,y,z); */
friend class Circle ;};
18.12.2017 P.O.O. - limbajul C++ (laborator) 18
C++. Probleme recapitulative (exemple)
class Circle{
/* Membrii Declarati Protected in clasa de baza sunt vazuti ca publici in clasa derivata. */
protected : Punct center;float radius;public : Circle (void) // Default Constructor
{radius = 0;/* nu mai e nevoie sa initializam membrul center, deoarece acesta a fostinitializat in momentul declararii prin Constructorul Punct(void); */
}
18.12.2017 P.O.O. - limbajul C++ (laborator) 19
C++. Probleme recapitulative (exemple)
Circle (Punct Center, float Radius){center = Center; // echivalent cu center = * new Punct ( Center.x, Center.y ,
Center.z)
if (Radius < 0 ) radius = 0;else radius = Radius;
}double Diameter(){
return 2*radius;}
18.12.2017 P.O.O. - limbajul C++ (laborator) 20
C++. Probleme recapitulative (exemple)
double Circumference(){
return 2*PI*radius;}
double Area(){
return radius * radius * PI;}
18.12.2017 P.O.O. - limbajul C++ (laborator) 21
Punct Center(){
return center;}
float Radius(){
return radius;}
C++. Probleme recapitulative (exemple)
void Display(){
cout << endl << " PROPRIETATILE CERCULUI :";cout << endl << " Centrul Cercului ";center.Afisare_Punct();cout << endl << " Raza Cercului = " << radius;cout << endl << " Diametrul Cercului = " << Diameter();cout << endl << " Circumferinta Cercului = " << Circumference();cout << endl << " Aria Cercului = " << Area();}
};
18.12.2017 P.O.O. - limbajul C++ (laborator) 22
C++. Probleme recapitulative (exemple)
class Sphere : public Circle{
private : Circle createdBy;public :Sphere (Circle cerc) : Circle ( cerc.Center() , cerc.Radius()){
createdBy = cerc;}Circle CreatedBy(){// Aceasta Functie Returneaza Cercul din care a provenit sfera;
return createdBy;}
18.12.2017 P.O.O. - limbajul C++ (laborator) 23
C++. Probleme recapitulative (exemple)double Volume(){ return radius * radius * radius * PI * 4 / 3; }void Show(){
cout << endl << " PROPRIETATILE SFEREI :";cout << endl << " Centrul Sferei ";center.Afisare_Punct();cout << endl << " Raza Sferei = " << radius;cout << endl << " Diametrul Sferei = " << Diameter();cout << endl << " Circumferinta Sferei = " << Circumference();cout << endl << " Aria Sferei = " << 4 * Area();cout << endl << " Volumul Sferei = " << Volume();
}};
18.12.2017 P.O.O. - limbajul C++ (laborator) 24
C++. Probleme recapitulative (exemple)
int main(){
float x,y,z,r;cout << endl << "Dati Coordonatele Centrului Cercului : ";cout << endl << " Centru ( x , y , z ) : x = "; cin >> x;cout << endl << " Centru ( "<<x<<" , y , z ) : y = "; cin >> y;cout << endl << " Centru ( "<<x<<" , " <<y <<" , z ) : z = "; cin >> z;Punct centru(x,y,z);cout << endl << " Raza = " ; cin >> r;
// Acum cream o sfera pe baza cercului format din Centru si Raza
Sphere sfera( Circle (centru , r) );
18.12.2017 P.O.O. - limbajul C++ (laborator) 25
C++. Probleme recapitulative (exemple)
/* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezintaconstructorul clasei Circle ce returneaza un obiect de tipul Circle. Cu alte cuvinte cescrie mai sus se traduce prin Sphere sfera ( un obiect de tipul Circle). In acest moment se executa Constructorul Clasei Sphere care nu face decat sa tina minte ( intr-o variabila ) cercul din care a provenit sfera */
sfera.CreatedBy().Display();/* sfera este un obiect de tipul Sphere. Clasa Sphere are ca membru o functie numitaCreatedBy() care returneaza cercul din care provine sfera. Asta inseamna ca sfera.CreatedBy() este un obiect de tipul Circle. In acelasi timp Clasa Circle are ca membru o functie numita Display() care afiseaza informatii despre cercDeci sfera.CreatedBy().Display() va afisa informatii despre cercul din care provineSfera*/
sfera.Show(); // afiseaza informatii despre un obiect de tipul Sphere
return 0;}
18.12.2017 P.O.O. - limbajul C++ (laborator) 26
C++. Probleme recapitulative (exemple)Rezultatul executiei programului:
18.12.2017 P.O.O. - limbajul C++ (laborator) 27
Top Related