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ă.
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:
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.
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
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”.
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
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”.
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