Junior
Ce știi despre cuvântul cheie virtual în C++?
sobes.tech AI
Răspuns de la AI
virtual în C++ este utilizat pentru a declara funcții virtuale în clasa de bază. Acest lucru permite implementarea polimorfismului în timpul execuției (polimorfism la runtime).
Aplicare:
- Definește o funcție în clasa de bază care poate fi suprascrisă (override) în clasele derivate.
- Când o funcție virtuală este apelată printr-un pointer sau referință la clasa de bază, în realitate se apelează implementarea funcției în obiectul clasei derivate (dacă a fost suprascrisă). Acest lucru se întâmplă în timpul execuției prin tabelul de funcții virtuale (vtable).
Puncte cheie:
- Doar funcțiile membre ale clasei pot fi virtuale. Funcțiile globale, funcțiile membre statice și constructorii nu pot fi virtuale.
- Destructori pot și trebuie să fie adesea virtuali pentru a evita scurgerile de memorie la ștergerea obiectelor din clasele derivate printr-un pointer la clasa de bază.
- Dacă o funcție este declarată
virtualîn clasa de bază, ea rămâne automat virtuală în toate clasele derivate, chiar dacă cuvântul cheievirtualnu este folosit explicit acolo (deși se recomandă utilizareavirtualșioverrideîn clasele derivate pentru claritate). - Funcțiile virtuale pure sunt declarate cu
= 0și fac clasa abstractă. O astfel de clasă nu poate fi instanțiată direct.
Exemplu:
#include <iostream>
class Base {
public:
virtual void print() {
std::cout << "Din Base" << std::endl;
}
virtual ~Base() {
std::cout << "Destructorul din Base" << std::endl;
}
};
class Derived : public Base {
public:
void print() override { // Utilizarea override pentru indicarea clară a suprascrierii
std::cout << "Din Derived" << std::endl;
}
~Derived() override { // Utilizarea override
std::cout << "Destructorul din Derived" << std::endl;
}
};
int main() {
Base* ptr = new Derived(); // Pointer la clasa de bază indicând spre un obiect derivat
ptr->print(); // Se apelează Derived::print() datorită funcției virtuale
delete ptr; // Se apelează destructori Derived și apoi Base datorită destructorului virtual
return 0;
}
Concepte conexe:
- vtable (tabelul funcțiilor virtuale): Tabel de pointeri către funcțiile virtuale ale clasei. Fiecare obiect cu funcții virtuale conține un pointer invizibil (vptr) către vtable-ul clasei sale.
- vptr (pointer către vtable): Necesitar pentru a determina funcția apelată în timpul execuției.
= 0(funcție virtuală pură): Indică faptul că funcția nu are implementare în această clasă, făcând-o abstractă.override(specificator de suprascriere): Indică explicit că funcția din clasa derivată suprascrie o funcție virtuală a clasei de bază. Ajută compiler-ul să detecteze erori dacă semnătura nu corespunde.final(specificator): Interzice suprascrierea ulterioară a funcției virtuale sau moștenirea de la clasă.
Pe scurt: virtual este mecanismul principal pentru implementarea polimorfismului prin moștenire și legare dinamică în C++.