Cos'è una funzione virtuale?
Una funzione virtuale è una funzione, definita in una superclasse, che deve essere presente in una sottoclasse affinché quella sottoclasse abbia una definizione completa della 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 viene definita la funzione - o sovrascritta, 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 della superclass.
Ci sono vantaggi e svantaggi per entrambe le metodologie. Definizione di una funzione come stub garantisce che tutte le sottoclassi HAci implementazioni, 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. Definizione di una pura funzione virtuale, d'altra parte, richiede che ogni sottoclasse abbia una propria definizione di funzione e appariranno errori se non è così.
Le funzioni virtuali, tuttavia, sono soggette alle stesse regole ereditarie delle funzioni non 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 sotto -Classe, Classe C. La classe C non richiede una definizione esplicita della funzione della classe A, perché eredita la definizione dalla classe B.Oppure potrebbe sovrascrivere la funzione della classe B, 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ò considerare 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.
Classi da B a G Deve avere tutti la funzione virtuale della classe A definita in qualche modo. Se la classe B ha un'implementazione della funzione di A, le classi D ed E non hanno bisogno di essere rifatta. Forse le sottoclassi di C devono implementare la funzione di A, 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 in 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ù semplice da capiregeneralmente. Ci sono molte insidie con funzioni virtuali, tuttavia, in particolare per quanto riguarda l'eredità multipla. In eredità multipla, è possibile che le funzioni virtuali definite ambiguamente siano in conflitto tra loro, quindi dovrebbero essere usate con cautela in quel contesto.