Skip to main content

Cos'è una funzione virtuale?

Una funzione virtuale è una funzione, definita in una superclasse, che deve essere presente in una sottoclasse per quella sottoclasse per avere una definizione completa di classe.Le funzioni virtuali si basano su un paradigma di programmazione orientato agli oggetti chiamato eredità virtuale, che è più comunemente visto in C ++ usando la parola chiave virtuale.Per definire una funzione virtuale, sono necessarie due classi, una superclasse e una sottoclasse.La superclasse è dove viene dichiarata la funzione per la prima volta e possibilmente definita.La sottoclasse è dove la funzione è definita mdash;o sovrascritto, a seconda che la funzione sia stata definita nella superclasse.

La funzione virtuale può essere definita in due modi.Innanzitutto, può essere definito come uno stub, in cui ha un corpo vuoto e non fa nulla.In secondo luogo, potrebbe essere definito come una pura funzione virtuale, in cui è definita come NULL nel file di intestazione delle superclassi.

Ci sono vantaggi e svantaggi per entrambe le metodologie.La definizione di una funzione come stub assicura che tutte le sottoclassi ne abbiano una certa implementazione, anche se non fa nulla.Se si dimentica di sovrascrivere la funzione e implementarla correttamente in una sottoclasse, tuttavia, non sembrano errori o avvertimenti che lo sottolineano.La definizione di una funzione virtuale pura, d'altra parte, richiede che ogni sottoclasse abbia una propria definizione di funzione e appariranno errori se questo non è così.

Le funzioni virtuali, tuttavia, sono soggette alle stesse regole di ereditàLe funzioni virtuali, quindi le gerarchie ereditarie con più di due livelli potrebbero non richiedere definizioni esplicite di funzioni virtuali.Ad esempio, si può prendere in considerazione una classe A che dichiara una funzione virtuale, che è implementata nella sottoclasse B. La classe B ha una parte della sua sottoclasse, Classe C. La classe C non richiede una definizione esplicita di classe come funzione, perché ereditaLa definizione della classe B. Se necessario, la classe C potrebbe sovrascrivere la funzione di classe BS, oppure potrebbe sovrascrivere la funzione di classe Bs, chiamandola anche.

All'altro estremo, le funzioni virtuali non devono essere definite in una sottoclasse se sono dichiarate virtuali in quella sottoclasse.Ad esempio, si può prendere in considerazione una classe A che dichiara una funzione virtuale e ha due sottoclassi, B e C. Inoltre, si potrebbe immaginare che la classe B abbia sottoclassi D ed E e la sottoclasse C ha le sottoclassi F e G.

B a g deve avere una classe come funzione virtuale definita in qualche modo.Se la classe B ha un'implementazione di AS Function, le classi D ed E non hanno bisogno di essere rifatta.Forse le sottoclassi CS devono implementare come funzione, ma entrambi fanno qualcosa di diverso, quindi definire la funzione nella stessa classe C non sarebbe utile.In tal caso, la funzione può essere dichiarata virtuale nella classe C e non è necessaria un'implementazione.

Le funzioni virtuali possono essere scoraggianti da imparare, ma se utilizzate correttamente, possono ridurre la duplicazione del codice e rendere il codice molto più facile da capire in generale.Ci sono molte insidie con funzioni virtuali, tuttavia, in particolare per quanto riguarda l'eredità multipla.In ereditarietà multipla, è possibile che le funzioni virtuali definite in modo ambiguo siano in conflitto tra loro, quindi dovrebbero essere usate con cautela in quel contesto.