Differenza tra funzione virtuale e funzione virtuale pura

Autore: Laura McKinney
Data Della Creazione: 2 Aprile 2021
Data Di Aggiornamento: 4 Maggio 2024
Anonim
Top 25 System Verilog Interview Questions and Answers for 2022
Video: Top 25 System Verilog Interview Questions and Answers for 2022

Contenuto


La funzione virtuale e la pura funzione virtuale sono entrambi concetti del polimorfismo di runtime. La principale differenza tra "funzione virtuale " e "Pura funzione virtuale" è che "funzione virtuale" ha la sua definizione nella classe base e anche le classi derivate ereditarie la ridefiniscono. La pura funzione virtuale non ha una definizione nella classe base e tutte le classi ereditarie derivate devono ridefinirla.

Tuttavia, la funzione virtuale viene anche chiamata come invio dinamico e invio in fase di esecuzione, poiché la funzione chiamata viene specificata in fase di esecuzione in base al tipo di oggetto utilizzato.

Il polimorfismo è supportato da entrambe le lingue C ++ e Java. In Java, il termine "sostituzione" viene utilizzato al posto di "funzione virtuale", poiché la funzione virtuale è il termine di C ++.

  1. Tabella di comparazione
  2. Definizione
  3. Differenze chiave
  4. Conclusione

Tabella di comparazione

Base per il confrontoFunzione virtualePura funzione virtuale
Di baseLa funzione virtuale ha la sua definizione nella classe base.La funzione virtuale pura non ha alcuna definizione nella classe base.
Dichiarazionenome funzione virtuale (lista_ parametri) {. . . . .};nome funzione virtuale (lista_ parametri) = 0;
Classe derivataTutte le classi derivate possono o meno sovrascrivere la funzione virtuale della classe base.Tutte le classi derivate devono sovrascrivere la funzione virtuale della classe base.
Effetto

Le funzioni virtuali sono di natura gerarchica; non influisce sulla compilazione se alcune classi derivate non sovrascrivono la funzione virtuale della classe base.Se tutte le classi derivate non riescono a sovrascrivere la funzione virtuale della classe base, si verificherà l'errore di compilazione.
Classe astrattaNessun concetto.Se una classe contiene almeno una funzione virtuale pura, viene dichiarata astratta.


Definizione di funzione virtuale

Il funzione virtuale è la funzione membro della classe base ed è ridefinita dalle classi derivate che ereditano la classe base. Non è necessario che tutte le classi derivate ereditarie debbano ridefinire la funzione virtuale, è solo ridefinita da quelle classi derivate che potrebbero richiedere il suo funzionamento. Una funzione virtuale viene creata dichiarando la funzione nella classe base preceduta dalla parola chiave 'virtuale'.

Dichiarazione:

class base {public: tipo virtuale funt_name (elenco parametri) {. . . }};

Le classi derivate ereditarie possono ridefinire la funzione virtuale senza alcuna parola chiave "virtuale". Le classi derivate ridefiniscono la funzione virtuale per svolgere il suo compito. Poiché la funzione virtuale viene ridefinita in classi derivate, abbiamo più forme della stessa funzione. Ora, quale versione della funzione viene chiamata, dipende dal tipo di oggetto a cui si fa riferimento per richiamare quella funzione.


Eredità multilivello

Nell'eredità multilivello, dove una classe derivata che ha ereditato la funzione virtuale dalla sua classe base, quando viene utilizzata come classe base per un'altra classe derivata, la funzione virtuale può ancora essere ignorata. Quindi, quando una funzione virtuale viene ereditata, anche la sua natura virtuale viene ereditata.

Le funzioni virtuali sono anche di natura gerarchica, ovvero se una classe derivata non sostituisce / ridefinisce la funzione virtuale ereditata dalla classe base e quando l'oggetto della classe derivata invoca quella funzione virtuale, viene invocata la funzione virtuale definita dalla classe base.

Definizione di funzione virtuale pura

Come visto sopra se la classe derivata non ha la precedenza sulla funzione virtuale, viene utilizzata la funzione virtuale definita dalla classe base. Ma cosa succede se la classe base stessa non definisce la funzione virtuale. Molte volte, la classe base non ha una definizione per la funzione virtuale, oppure a volte si desidera che tutte le classi derivate debbano sovrascrivere la funzione virtuale.

Per gestire queste due situazioni precedenti, C ++ supporta il concetto di "Pura funzione virtuale“. Una "funzione virtuale pura" è dichiarata nella classe base ma non ha la sua definizione nella classe base. La pura funzione virtuale è dichiarata come segue.

tipo virtuale funct_name (parameter_list) = 0;

Ogni volta che una funzione virtuale nella classe base viene resa "pura", ogni classe derivata deve obbligatoriamente sovrascrivere la funzione virtuale pura della classe base. Se la classe derivata non riesce a sovrascrivere la funzione virtuale pura della classe base, si verificherà un errore di compilazione.

Classe astratta

La classe che contiene almeno una funzione pura è chiamata "classe astratta". Non è possibile creare oggetti di classi astratte, ma è possibile creare riferimenti e puntatori a classi astratte. È possibile accedere ai membri delle classi astratte tramite l'oggetto delle classi derivate che eredita la classe base astratta.

Una classe che vuoi dichiarare astratta, usa la parola chiave 'astratto' di fronte a 'classe' parola chiave.

// ad esempio classe astratta class-name {. . tipo virtuale funct_name (parameter_list) = 0; . . };

  1. Le funzioni virtuali sono definitivamente definite nella classe base e ridefinite (override) nella classe derivata. D'altra parte, pura funzione virtuale la classe base non è particolarmente definita nella classe base
  2. La classe derivata, se necessario, ridefinisce (sovrascrive) la funzione virtuale mentre, in caso di funzione virtuale pura, la classe derivata deve ridefinire definitivamente la funzione virtuale pura.
  3. Se la classe derivata non riesce a ridefinire (sovrascrivere) la funzione virtuale, può utilizzare la funzione virtuale della classe base. Al contrario, se una classe derivata non riesce a sovrascrivere la funzione virtuale pura, si verifica un errore di compilazione.
  4. La classe di base contenente la funzione virtuale può essere istanziata, ovvero può essere creato il suo oggetto. Al contrario, la classe base contenente pura funzione virtuale, ovvero una classe astratta non può essere istanziata in quanto una classe astratta non è completamente definita.

Nota:
Il prototipo della "funzione virtuale" e della "funzione virtuale pura" rimane lo stesso per tutto il programma.

Conclusione:

Le "funzioni virtuali" e la "funzione virtuale pura" hanno entrambe la loro importanza, come nelle "funzioni virtuali", tutte le classi derivate non hanno bisogno di ridefinire la funzione virtuale e dove vogliamo che tutte le classi derivate debbano ridefinire la funzione virtuale, pura virtuale la funzione si applica meglio lì.