InformaticăliceuClasa 11dificil
Polimorfism și Funcții Virtuale în C++
Înțelege polimorfismul la runtime folosind funcții virtuale și clase abstracte în C++.
2 luni în urmă
0 vizualizări
35 minute
Polimorfism și Funcții Virtuale în C++
Ce este Polimorfismul?
Polimorfismul permite obiectelor de tipuri diferite să fie tratate uniform prin aceeași interfață.
Funcții Virtuale
1#include <iostream> 2using namespace std; 3 4class Forma { 5public: 6 // Funcție virtuală - poate fi suprascrisă 7 virtual void deseneaza() { 8 cout << "Desenez o forma generica" << endl; 9 } 10 11 // Funcție virtuală pură - clasa devine abstractă 12 virtual double arie() = 0; 13 14 // Destructor virtual - OBLIGATORIU pentru clase polimorfice 15 virtual ~Forma() {} 16}; 17 18class Cerc : public Forma { 19private: 20 double raza; 21 22public: 23 Cerc(double r) : raza(r) {} 24 25 void deseneaza() override { 26 cout << "Desenez un cerc cu raza " << raza << endl; 27 } 28 29 double arie() override { 30 return 3.14159 * raza * raza; 31 } 32}; 33 34class Dreptunghi : public Forma { 35private: 36 double lungime, latime; 37 38public: 39 Dreptunghi(double l, double L) : lungime(l), latime(L) {} 40 41 void deseneaza() override { 42 cout << "Desenez un dreptunghi " << lungime << "x" << latime << endl; 43 } 44 45 double arie() override { 46 return lungime * latime; 47 } 48}; 49 50int main() { 51 // Polimorfism prin pointeri la clasa de bază 52 Forma* forme[3]; 53 forme[0] = new Cerc(5); 54 forme[1] = new Dreptunghi(4, 6); 55 forme[2] = new Cerc(3); 56 57 for (int i = 0; i < 3; i++) { 58 forme[i]->deseneaza(); 59 cout << "Arie: " << forme[i]->arie() << endl << endl; 60 } 61 62 // Eliberare memorie 63 for (int i = 0; i < 3; i++) { 64 delete forme[i]; 65 } 66 67 return 0; 68}
Virtual vs Non-Virtual
1class Baza { 2public: 3 void metoda() { cout << "Baza" << endl; } 4 virtual void metodaVirtuala() { cout << "Baza virtuala" << endl; } 5}; 6 7class Derivata : public Baza { 8public: 9 void metoda() { cout << "Derivata" << endl; } 10 void metodaVirtuala() override { cout << "Derivata virtuala" << endl; } 11}; 12 13int main() { 14 Baza* ptr = new Derivata(); 15 16 ptr->metoda(); // Afișează: Baza (legare statică) 17 ptr->metodaVirtuala(); // Afișează: Derivata virtuala (legare dinamică) 18 19 delete ptr; 20 return 0; 21}
Clase Abstracte
O clasă cu cel puțin o funcție virtuală pură devine abstractă și nu poate fi instanțiată direct.
1class InterfataComparabila { 2public: 3 virtual int compara(const InterfataComparabila& other) const = 0; 4 virtual ~InterfataComparabila() {} 5};
Tutorialul te-a ajutat?
Dacă ai nevoie de ajutor personalizat, găsește un profesor calificat pentru meditații
