Ce este moștenirea virtuală?

Moștenirea virtuală este un tip de moștenire în care implementarea unei superclase este incompletă și este necesară o subclasă pentru definirea completă a unui obiect. Acest tip de moștenire poate fi folosit împreună cu moștenirea unică și multiplă, dar este cel mai frecvent utilizat în moștenirea multiplă. Orice clasă care moștenește de la o clasă de bază virtuală devine o subclasă directă a acelei clase de bază. O clasă de bază virtuală se poate baza pe o subclasă pentru a-și implementa toate metodele, dar aceasta nu este o cerință.

C++ este cel mai cunoscut limbaj de computer pentru utilizarea moștenirii virtuale. Pentru a declara moștenirea virtuală în C++, este folosit cuvântul cheie „virtual”. Atât superclasa, cât și subclasa trebuie să declare metode virtuale cu cuvântul cheie „virtual”. Aceasta îi spune compilatorului C++ că superclasa este incompletă și trebuie să obțină informații de la subclasă pentru a o completa. Folosirea subclasei pentru a completa superclasa nu înseamnă că subclasele se suprascriu unele pe altele dacă au aceeași clasă de bază, iar în schimb compilatorul C++ se ocupă de a determina ce piese merg cu fiecare obiect.

Deoarece o clasă de bază virtuală este necesară pentru moștenirea virtuală, funcțiile globale din C++ nu pot fi declarate virtuale. Acest tip de moștenire poate fi utilizat numai atunci când se aderă la principiile de programare orientată pe obiecte (OOP). Motivul pentru aceasta este că funcțiile globale nu sunt asociate cu o anumită clasă și, prin urmare, sunt de obicei autonome pe cont propriu. Fără o superclasă și o subclasă moștenirea nu se poate întâmpla, așa că funcțiile globale și moștenirea virtuală se exclud reciproc. Funcțiile globale pot fi, teoretic, utilizate în interiorul funcțiilor virtuale, dar inversul poate să nu funcționeze întotdeauna.

Moștenirea virtuală este folosită pentru a rezolva multe probleme de programare, iar una dintre cele mai utile este rezolvarea ambiguității. În moștenirea multiplă, cineva poate avea o clasă de bază A care are două subclase, B și C, și apoi o clasă D care moștenește din ambele clase B și C. Acest model este denumit în mod obișnuit „diamantul morții”, deoarece dacă clasele A, B și C au toate implementări ale aceleiași metode, nu este posibil ca clasa D să determine ce implementare ar trebui să folosească. Moștenirea virtuală rezolvă această problemă deoarece implementarea fiecărei clase rămâne distinctă și, prin urmare, lipsită de ambiguitate. Această distincție este gestionată de obiecte interne specializate numite tabele virtuale (vtables) care țin evidența fiecărui tip de obiect, dar aceste tabele nu trebuie să fie manipulate în mod explicit de un programator deoarece sunt încorporate în limbaj.