11c++ probleme recapitulative (partea ii) - probleme... · probleme recapitulative (exemple) /*...

27
Programare orientat ă pe obiecte # 11 Adrian Runceanu www.runceanu.ro/adrian 2016 C ++ Probleme recapitulative ( partea II)

Upload: others

Post on 07-Mar-2020

43 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

Programare orientată peobiecte

# 11

Adrian Runceanuwww.runceanu.ro/adrian

2016

C++Probleme recapitulative (partea II)

Page 2: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 3: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 4: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 5: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 6: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 7: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

C++. Probleme recapitulative (exemple)

Rezultatul executiei programului:

18.12.2017 P.O.O. - limbajul C++ (laborator) 7

Page 8: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 9: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 10: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 11: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 12: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 13: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 14: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

C++. Probleme recapitulative (exemple)

Rezultatul executiei programului:

18.12.2017 P.O.O. - limbajul C++ (laborator) 14

Page 15: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 16: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 17: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 18: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 19: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 20: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 21: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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;}

Page 22: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 23: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 24: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 25: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 26: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

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

Page 27: 11C++ Probleme recapitulative (partea II) - probleme... · Probleme recapitulative (exemple) /* Sphere sfera( Circle (centru , r) ) echivalent cu Circle(centru , r) reprezinta constructorul

[email protected]

C++. Probleme recapitulative (exemple)Rezultatul executiei programului:

18.12.2017 P.O.O. - limbajul C++ (laborator) 27