Che cos'è una classe virtuale?
Una classe virtuale è una classe che viene allocata una sola volta in memoria, in modo tale che i figli di quella classe utilizzino solo una copia di quella classe genitore stabilita in memoria. Una classe è un gruppo di oggetti che condividono tratti o attributi comuni. La creazione di una classe virtuale offre ai linguaggi di programmazione orientati agli oggetti la possibilità di utilizzare l'ereditarietà multipla quando le classi padre di seconda o più generazioni derivano 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 determinata 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 e le funzioni membro da entrambe le classi principali contemporaneamente e avere accesso a entrambi i set di dati e funzioni principali. Altre lingue che supportano l'ereditarietà multipla includono Perl, Python, Tcl ed Eiffel.
Un problema si verifica in più gerarchie ereditarie quando due o più classi parent utilizzate per creare una classe child sono originariamente derivate solo da una o la stessa classe nonno. Questo è chiamato il problema del diamante, il nome deriva da come la gerarchia apparirebbe in questa situazione. Quando un programma di compilazione tenta di creare un'istanza di una classe, ad esempio una classe nipote composta da due classi parent con un nonno comune, vengono create 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 il nipote dovrebbe usare per accedere ai dati o alle funzioni del nonno. Per porre rimedio a questa situazione, in C ++ il nonno viene trasformato in una classe virtuale quando dichiara i genitori. Questo fa sì che il compilatore esegua una sola copia del nonno in 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 dovrebbe accedere al nonno perché esiste una sola copia del nonno.
Si dovrebbe prestare molta attenzione nella strutturazione delle 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 classi una maggiore latitudine nello sviluppo; tuttavia, possono potenzialmente causare errori difficili da individuare. Lo studio di solidi principi di ingegneria della programmazione informatica contribuirà a garantire che non si verifichino effetti collaterali imprevisti causati da un'organizzazione impropria del programma.