Che cos’è una classe virtuale?

Una classe virtuale è una classe allocata una sola volta in memoria, in modo che i figli di quella classe utilizzino solo una copia di quella classe genitore che è stabilita in memoria. Una classe è un gruppo di oggetti che condividono tratti o attributi comuni. Rendere virtuale una classe offre ai linguaggi di programmazione orientati agli oggetti la capacità di utilizzare l’ereditarietà multipla quando le classi padre di seconda o più generazione sono derivate da classi base ancestrali comuni. A seconda del linguaggio di programmazione del computer a cui si fa riferimento, la parola chiave “virtuale”, la parola chiave simile o la sintassi e la semantica di una classe vengono utilizzate per implicare che una particolare classe deve essere considerata virtuale.

Non tutti i linguaggi di programmazione orientati agli oggetti consentono l’ereditarietà multipla, ovvero quando una classe figlio può essere derivata da più classi padre contemporaneamente. In un linguaggio di programmazione come C++, una classe può ereditare tutti i dati membro e le funzioni membro da entrambe le classi padre contemporaneamente e avere accesso a entrambi i set di dati e funzioni padre. Altri linguaggi che supportano l’ereditarietà multipla includono Perl, Python, Tcl ed Eiffel.

Si verifica un problema nelle gerarchie di ereditarietà multiple quando due o più classi padre utilizzate per creare una classe figlio derivano originariamente da una sola o dalla stessa classe nonna. Questo è chiamato il problema del diamante, il nome deriva da come apparirebbe la gerarchia in questa situazione. Quando un programma compilatore tenta di istanziare una classe, come una classe nipote composta da due classi genitori con un nonno comune, vengono create in memoria due copie del nonno, una per ciascun genitore.

A causa dell’ambiguità causata da più copie dello stesso nonno in memoria, il compilatore non è in grado di accertare quale copia del nonno dovrebbe utilizzare il nipote per accedere ai dati o alle funzioni dei nonni. Per rimediare a questa situazione, in C++ il nonno viene trasformato in una classe virtuale quando si dichiarano i genitori. Ciò fa sì che il compilatore esegua solo una copia del nonno nella memoria condivisa da entrambi i genitori. Una volta che il nonno è diventato una classe virtuale, il compilatore non ha problemi a decidere come il nipote deve accedere al nonno perché c’è solo una copia del nonno.

Bisogna prestare molta attenzione quando si strutturano le gerarchie di classi, specialmente quando saranno incluse o diventeranno la base per gerarchie molto più grandi in futuro. Il corretto utilizzo di una classe virtuale offre alle gerarchie di classe una maggiore libertà di sviluppo; tuttavia, possono causare errori difficili da individuare. Lo studio di solidi principi di ingegneria della programmazione informatica aiuterà a garantire che non si verifichino effetti collaterali imprevisti derivanti da un’organizzazione impropria del programma.