Skip to main content

Cos'è l'eredità virtuale?

L'eredità virtuale è un tipo di eredità in cui l'implementazione di una superclasse è incompleta ed è richiesta una sottoclasse per la definizione completa di un oggetto.Questo tipo di eredità può essere utilizzato insieme a un'eredità singola e multipla, ma è più comunemente usato in ereditarietà multipla.Qualsiasi classe che eredita da una classe di base virtuale diventa una sottoclasse diretta di quella classe base.Una classe di base virtuale può fare affidamento su una sottoclasse per implementare tutti i suoi metodi, ma questo non è un requisito.

C ++ è il linguaggio del computer più comunemente noto per utilizzare l'eredità virtuale.Per dichiarare l'eredità virtuale in C ++, viene utilizzata la parola chiave virtuale.Sia la superclasse che la sottoclasse devono dichiarare metodi virtuali con la parola chiave virtuale.Ciò dice al compilatore C ++ che la superclasse è incompleta e deve ottenere informazioni dalla sottoclasse per completarla.L'uso della sottoclasse per completare la superclasse non significa che le sottoclassi si sovrascrivono a vicenda se hanno la stessa classe di base, e invece il compilatore C ++ si occupa di determinare quali pezzi vanno con ciascun oggetto.

poiché è necessaria una classe di base virtuale per virtualeEredità, le funzioni globali in C ++ non possono essere dichiarate virtuali.Questo tipo di eredità può essere utilizzato solo quando si aderisce ai principi di programmazione orientati agli oggetti (OOP).La ragione di ciò è che le funzioni globali non sono associate a una particolare classe, e quindi di solito si autonomano da sole.Senza una superclasse e un'eredità della sottoclasse non possono verificarsi, quindi le funzioni globali e l'eredità virtuale si escludono a vicenda.Le funzioni globali possono, in teoria, essere utilizzate all'interno delle funzioni virtuali, ma il contrario potrebbe non sempre funzionare.

L'eredità virtuale viene utilizzata per risolvere molti problemi di programmazione e una delle più utili è la risoluzione dell'ambiguità.In ereditarietà multipla, si può avere una classe A di base che ha due sottoclassi, B e C, e quindi una classe D che eredita da entrambe le classi B e C. Questo modello è comunemente chiamato diamante della morte perché se le classi A, B,e C hanno tutti implementazioni dello stesso metodo, non è possibile per la classe D determinare quale implementazione dovrebbe utilizzare.L'eredità virtuale risolve questo problema perché ogni implementazione delle classi rimane distinta e quindi inequivocabile.Questa distinzione è gestita da oggetti interni specializzati chiamati tabelle virtuali (vtables) che tengono traccia di ciascun tipo di oggetto, ma queste tabelle non devono essere esplicitamente manipolate da un programmatore perché sono integrate nel linguaggio.