Come implementare la funzione virtuale in C ++?



Questo articolo ti introdurrà a un altro concetto di programmazione che è la funzione virtuale in C ++. Il concetto sarà supportato da una dimostrazione.

Una funzione virtuale in C ++ è una funzione membro all'interno della classe base che ridefiniamo in una classe derivata. Questo articolo ti aiuterà a esplorare il concetto in dettaglio. I seguenti puntatori saranno trattati in questo articolo,

Quindi iniziamo con questo articolo sulla funzione virtuale in C ++





Cos'è la funzione virtuale?

Una funzione virtuale è una funzione membro all'interno della classe base che ridefiniamo in una classe derivata. Viene dichiarato utilizzando la parola chiave virtuale. Quando una classe contenente una funzione virtuale viene ereditata, la classe derivata ridefinisce la funzione virtuale per soddisfare le proprie esigenze.

Andando avanti con questo articolo sulla funzione virtuale in C ++



Regole per la funzione virtuale in C ++:

  • Sono sempre definiti in una classe base e sovrascritti nella classe derivata, ma non è obbligatorio eseguire l'override nella classe derivata.
  • Le funzioni virtuali devono essere dichiarate nella sezione pubblica della classe.
  • Non possono essere statiche o funzione amico, inoltre non possono essere la funzione virtuale di un'altra classe.
  • È necessario accedere alle funzioni virtuali utilizzando un puntatore per ottenere il polimorfismo in fase di esecuzione.

Andando avanti con questo articolo sulla funzione virtuale in C ++.

Cosa è vincolante?

Il binding per le funzioni significa che ovunque sia presente una chiamata di funzione, il compilatore deve sapere a quale definizione di funzione deve essere abbinata. Ciò dipende dalla firma di ogni dichiarazione di funzione e dagli incarichi presi. Inoltre, il compilatore deve sapere che quando avverrà questa corrispondenza tra la chiamata di funzione e la scelta della definizione corretta.

Andando avanti con questo articolo sulla funzione virtuale in C ++



Rilegatura anticipata

L'associazione anticipata è un fenomeno in cui la decisione di abbinare le varie chiamate di funzione avviene durante la compilazione stessa e il compilatore associa direttamente il collegamento agli indirizzi. È anche noto come associazione statica o associazione in fase di compilazione.

  • Come sappiamo, scriviamo codice nel linguaggio di alto livello
  • Quindi il compilatore lo converte in un linguaggio di basso livello che il computer può comprendere, principalmente linguaggio macchina al momento della compilazione
  • Nell'associazione anticipata, il compilatore fornisce direttamente l'indirizzo dell'istruzione di dichiarazione di funzione all'istruzione di chiamata di funzione
  • Quindi, come suggerisce il nome, l'associazione avviene molto presto prima che il programma venga eseguito.

Esempio

#include utilizzando lo spazio dei nomi std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // ritorno del binding anticipato 0}

Produzione

Output - Funzione virtuale in C ++ - Edureka

chiarimenti ione
In questo esempio, abbiamo creato un puntatore a alla classe genitore Animals. Quindi scrivendo a = & c, il puntatore 'a' ha iniziato a riferirsi all'oggetto c della classe Cats.
a -> sound () - Chiamando la funzione sound () presente in entrambe le classi tramite il puntatore 'a', viene chiamata la funzione della classe genitrice, anche se il puntatore si riferisce all'oggetto della classe Cats .

Ciò è dovuto a Early Binding. Sappiamo che 'a' è un puntatore della classe genitore che fa riferimento all'oggetto della classe figlia. Poiché l'associazione anticipata avviene in fase di compilazione, quindi quando il compilatore ha visto che 'a' è un puntatore della classe genitore, ha fatto corrispondere la chiamata con la funzione 'sound ()' della classe genitore senza cercare l'oggetto il puntatore esso si riferisce a.

Andando avanti con questo articolo sulla funzione virtuale in C ++

Rilegatura tardiva

Nel binding tardivo, il compilatore identifica l'oggetto in fase di esecuzione e quindi abbina la chiamata alla funzione con la funzione corretta. È anche noto come associazione dinamica o associazione runtime.

L'associazione tardiva nel problema precedente può essere risolta utilizzando la parola chiave virtuale nella classe base. Vediamo come ciò avvenga utilizzando lo stesso esempio precedente, ma aggiungendo solo una parola chiave virtuale.

Esempio

#include using namespace std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sound () return 0}

Produzione

Spiegazione
Qui la funzione sound () della classe base è resa virtuale, quindi il compilatore ora esegue l'associazione tardiva per questa funzione. Ora, la chiamata della funzione sound () verrà abbinata alla definizione della funzione in fase di esecuzione. Poiché il compilatore ora identifica il puntatore 'a' come riferito all'oggetto 'c' della classe derivata Cats, chiamerà la funzione sound () della classe Cats.

Andando avanti con questo articolo sulla funzione virtuale in C ++

Pura funzione virtuale

Una funzione virtuale pura in C ++ è una funzione virtuale per la quale non abbiamo un'implementazione, la dichiariamo solo. Una funzione virtuale pura viene dichiarata assegnando 0 nella dichiarazione.

suono del vuoto virtuale () = 0

Qui sound () è una pura funzione virtuale.

Andando avanti con questo articolo sulla funzione virtuale in C ++

come implementare hashmap in java

Classe astratta

Una classe astratta è definita come una classe con una o più funzioni virtuali pure. Come spiegato sopra, la funzione virtuale pura è una funzione membro virtuale contrassegnata come priva di implementazione. Non ha alcuna implementazione possibile con le informazioni fornite nella classe, comprese le classi base. Una classe astratta è anche nota come classe base astratta.

Esempio

#include using namespace std class Employee // abstract base class {virtual int getSalary () = 0 // pure virtual function} class Employee_1: public Employee {int salary public: Employee_1 (int s) {salary = s} int getSalary () {return salary}} class Employee_2: public Employee {int salary public: Employee_2 (int t) {salary = t} int getSalary () {return salary}} int main () {Employee_1 e1 (5000) Employee_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

Produzione

Spiegazione
La funzione 'getSalary ()' nella classe Employee è una pura funzione virtuale. Poiché la classe Employee contiene la funzione virtuale pura, è quindi una classe base astratta.
Poiché la funzione virtuale pura è definita nelle sottoclassi, quindi la funzione 'getSalary ()' è definita in entrambe le sottoclassi della classe Employee cioè in Employee_1 e Employee_2.

Andando avanti con questo articolo sulla funzione virtuale in C ++

Esempio per la funzione virtuale

#include utilizzando lo spazio dei nomi di base della classe std {public: void function_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout funzione_2 () ptr-> funzione_3 () ptr-> funzione_4 ()}

Produzione

Spiegazione
Per la chiamata di funzione function_1 (), viene chiamata la versione della classe base della funzione, function_2 () viene sovrascritta nella classe derivata quindi viene chiamata la versione della classe derivata, function_3 () non viene sovrascritta nella classe derivata ed è una funzione virtuale, quindi viene chiamata la versione della classe base, allo stesso modo function_4 () non viene sovrascritta, quindi viene chiamata la versione della classe base.

Quindi siamo giunti alla fine di questo articolo sulla 'Funzione virtuale in C ++'. Se desideri saperne di più, dai un'occhiata al da Edureka, una società di apprendimento online affidabile. Il corso di formazione e certificazione Java J2EE e SOA di Edureka è progettato per formarti sia sui concetti di base che avanzati su Java insieme a vari framework Java come Hibernate e Spring.

Hai domande per noi? Per favore, menzionalo nella sezione commenti di questo blog e ti risponderemo il prima possibile.