Salt la conținutul principal
Modulul 6 · Lecția 2 din 214/18 în curs~15 min
Lecții din modul (2/2)

Polimorfism și funcții virtuale

Polimorfismul ne permite să tratăm obiecte din diferite clase derivate printr-un pointer sau o referință la clasa lor de bază, asigurându-ne că versiunea corectă a unei metode este apelată în timpul execuției (Late Binding).

Funcții virtuale: virtual și override

Pentru a activa polimorfismul pe o metodă, trebuie să o declarăm folosind cuvântul cheie virtual în interiorul clasei de bază. În clasele derivate, folosim specificatorul override pentru a declara în mod explicit că suprascriem acea metodă.

C++
class Employee {
public:
    virtual void work() {
        std::cout << "Generic work" << std::endl;
    }
    // IMPORTANT: Virtual destructor in base class to avoid memory leaks
    virtual ~Employee() = default;
};

class Developer : public Employee {
public:
    void work() override {
        std::cout << "Writing C++ code" << std::endl;
    }
};

Folosind pointeri către clasa de bază, C++ va rezolva metoda corectă în timpul execuției:

C++
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;

Clase abstracte și funcții virtuale pure

O funcție virtuală pură este o funcție membru virtual declarată cu = 0 la sfârșit. Reprezintă un contract formal: clasa de bază nu oferă nicio implementare, delegând-o în întregime subclaselor.

O clasă care conține cel puțin o funcție virtuală pură se numește Clasă abstractă și nu poate fi instanțiată direct.

C++
class Instrument {
public:
    virtual void play() = 0; // Pure virtual
    virtual ~Instrument() = default;
};

class Piano : public Instrument {
public:
    void play() override {
        std::cout << "Playing piano..." << std::endl;
    }
};

Încercați-l singur

Exercițiu#cpp.m6.l2.e1
Încercări: 0Se încarcă…

Definiți o metodă virtuală makeSound() în Animal care afișează „Un sunet”. Apoi suprascrieți-l în clasa Cat folosind specificatorul de înlocuire pentru a imprima „Meow”.

Se încarcă editorul...
Afișează indiciu

Nu uitați să adăugați `virtual` la metoda clasei de bază și să plasați `override` după parantezele parametrilor în clasa derivată.

Soluție disponibilă după 3 încercări

Exercițiu#cpp.m6.l2.e2
Încercări: 0Se încarcă…

Declarați o funcție virtuală pură print() care returnează void în cadrul clasei abstracte Printable. Apoi creați clasa Document care moștenește public din Printable și implementează metoda print() pentru a tipări „Printing Document”.

Se încarcă editorul...
Afișează indiciu

O funcție virtuală pură este declarată cu semnătura `virtual void print() = 0;`. Asigurați-vă că „Documentul” moștenește public din „Printable”.

Soluție disponibilă după 3 încercări