Comment implémenter une fonction virtuelle en C ++?

Cet article vous présentera encore un autre concept de programmation qui est la fonction virtuelle en C ++. Le concept sera soutenu par une démonstration.

Une fonction virtuelle dans C ++ est une fonction membre de la classe de base que nous redéfinissons dans une classe dérivée. Cet article vous aidera à explorer le concept en détail. Les pointeurs suivants seront traités dans cet article,



Alors commençons avec cet article sur la fonction virtuelle en C ++



Qu'est-ce que la fonction virtuelle?

Une fonction virtuelle est une fonction membre de la classe de base que nous redéfinissons dans une classe dérivée. Il est déclaré à l'aide du mot-clé virtuel. Lorsqu'une classe contenant une fonction virtuelle est héritée, la classe dérivée redéfinit la fonction virtuelle en fonction de ses propres besoins.

Passer à cet article sur la fonction virtuelle en C ++



Règles pour la fonction virtuelle en C ++:

  • Ils sont toujours définis dans une classe de base et remplacés dans la classe dérivée, mais il n'est pas obligatoire de les remplacer dans la classe dérivée.
  • Les fonctions virtuelles doivent être déclarées dans la section publique de la classe.
  • Ils ne peuvent pas être statiques ou la fonction amie ne peut pas non plus être la fonction virtuelle d'une autre classe.
  • Les fonctions virtuelles doivent être accédées à l'aide d'un pointeur pour obtenir un polymorphisme d'exécution.

Passez à cet article sur la fonction virtuelle en C ++.

Qu'est-ce qui est contraignant?

La liaison pour les fonctions signifie que partout où il y a un appel de fonction, le compilateur a besoin de savoir à quelle définition de fonction il doit correspondre. Cela dépend de la signature de chaque déclaration de fonction et des affectations qui sont prises. En outre, le compilateur doit savoir que lorsque cette correspondance entre l'appel de fonction et le choix de la définition correcte se produira.

Passer à cet article sur la fonction virtuelle en C ++



Reliure précoce

La liaison précoce est un phénomène dans lequel la décision de faire correspondre divers appels de fonction se produit au moment de la compilation et le compilateur associe directement le lien avec des adresses. Il est également connu sous le nom de liaison statique ou de liaison au moment de la compilation.

  • Comme nous le savons, nous écrivons du code dans le langage de haut niveau
  • Ensuite, le compilateur le convertit en langage de bas niveau que l'ordinateur peut comprendre, principalement en langage machine au moment de la compilation
  • Dans la liaison anticipée, le compilateur fournit directement l'adresse de l'instruction de déclaration de fonction à l'instruction d'appel de fonction
  • Ainsi, comme son nom l'indique, la liaison se produit très tôt avant l'exécution du programme.

Exemple

#include en utilisant l'espace de nom classe std Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // retour de liaison anticipée 0}

Production

différence entre bigdata et hadoop

Sortie - Fonction virtuelle en C ++ - Edureka

clarifications ion
Dans cet exemple, nous avons créé un pointeur vers la classe parente Animals. Puis en écrivant a = & c, le pointeur «a» a commencé à faire référence à l’objet c de la classe Cats.
a -> sound () - En appelant la fonction sound () qui est présente dans les deux classes par le pointeur 'a', la fonction de la classe parent a été appelée, même si le pointeur fait référence à l'objet de la classe Cats .

Cela est dû à la liaison anticipée. Nous savons que «a» est un pointeur de la classe parent faisant référence à l’objet de la classe enfant. Étant donné que la liaison précoce a lieu au moment de la compilation, par conséquent, lorsque le compilateur a vu que 'a' est un pointeur de la classe parente, il a mis en correspondance l'appel avec la fonction 'sound ()' de la classe parente sans rechercher l'objet le pointeur il fait référence à.

Passer à cet article sur la fonction virtuelle en C ++

Reliure tardive

Dans la liaison tardive, le compilateur identifie l'objet au moment de l'exécution, puis fait correspondre l'appel de fonction avec la fonction correcte. Il est également connu sous le nom de liaison dynamique ou liaison d'exécution.

La liaison tardive dans le problème ci-dessus peut être résolue en utilisant le mot-clé virtuel dans la classe de base. Voyons comment cela se produit en utilisant l'exemple ci-dessus lui-même, mais en ajoutant uniquement un mot clé virtuel.

Exemple

#include en utilisant l'espace de noms classe std Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sound () retour 0}

Production

Explication
Ici, la fonction sound () de la classe de base est rendue virtuelle, ainsi le compilateur effectue maintenant une liaison tardive pour cette fonction. Désormais, l'appel de fonction de la fonction sound () correspondra à la définition de la fonction lors de l'exécution. Puisque le compilateur identifie maintenant le pointeur «a» comme faisant référence à l'objet «c» de la classe dérivée Cats, il appellera la fonction sound () de la classe Cats.

Passer à cet article sur la fonction virtuelle en C ++

Fonction virtuelle pure

Une fonction virtuelle pure en C ++ est une fonction virtuelle pour laquelle nous n'avons pas d'implémentation, nous la déclarons seulement. Une fonction virtuelle pure est déclarée en affectant 0 dans la déclaration.

son vide virtuel () = 0

Ici, le son () est une pure fonction virtuelle.

Passer à cet article sur la fonction virtuelle en C ++

Classe abstraite

Une classe abstraite est définie comme une classe avec une ou plusieurs fonctions virtuelles pures. Comme expliqué ci-dessus, la fonction virtuelle pure est une fonction membre virtuelle qui est marquée comme n'ayant pas d'implémentation. Il n'a aucune implémentation possible avec les informations fournies dans la classe, y compris les classes de base. Une classe abstraite est également appelée classe de base abstraite.

Exemple

#include using namespace std class Employee // classe de base abstraite {virtual int getSalary () = 0 // fonction virtuelle pure} classe Employee_1: public Employee {int salaire public: Employee_1 (int s) {salaire = s} int getSalary () {salaire de retour}} classe Employee_2: public Employee {int salaire public: Employee_2 (int t) {salaire = t} int getSalary () {return salaire}} 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 } 

Production

Explication
La fonction ‘getSalary ()’ de la classe Employee est une fonction virtuelle pure. Puisque la classe Employee contient la fonction virtuelle pure, il s'agit donc d'une classe de base abstraite.
Comme la fonction virtuelle pure est définie dans les sous-classes, la fonction «getSalary ()» est donc définie dans les deux sous-classes de la classe Employee, c'est-à-dire dans Employee_1 et Employee_2.

Passer à cet article sur la fonction virtuelle en C ++

Exemple de fonction virtuelle

#include en utilisant l'espace de noms base de 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 function_2 () ptr-> function_3 () ptr-> function_4 ()}

Production

Explication
Pour l'appel de fonction function_1 (), la version de classe de base de function est appelée, function_2 () est surchargée dans la classe dérivée donc la version de classe dérivée est appelée, function_3 () n'est pas surchargée dans la classe dérivée et est une fonction virtuelle donc la version de classe de base est appelée, de même function_4 () n'est pas surchargée, donc la version de la classe de base est appelée.

Nous sommes donc arrivés à la fin de cet article sur «Virtual Function in C ++». Si vous souhaitez en savoir plus, consultez le par Edureka, une entreprise d'apprentissage en ligne de confiance. Le cours de formation et de certification Java J2EE et SOA d'Edureka est conçu pour vous former aux concepts Java de base et avancés ainsi qu'à divers frameworks Java tels que Hibernate et Spring.

Vous avez une question pour nous? Veuillez le mentionner dans la section commentaires de ce blog et nous vous répondrons dans les plus brefs délais.