- Une fonction virtuelle C++ est une fonction membre de la classe de base que vous redéfinissez dans une classe dérivée. Il est déclaré à l'aide du mot-clé virtual.
- Il est utilisé pour indiquer au compilateur d'effectuer une liaison dynamique ou une liaison tardive sur la fonction.
- Il est nécessaire d'utiliser le pointeur unique pour faire référence à tous les objets des différentes classes. Nous créons donc le pointeur vers la classe de base qui fait référence à tous les objets dérivés. Mais, lorsque le pointeur de classe de base contient l’adresse de l’objet de classe dérivé, exécute toujours la fonction de classe de base. Ce problème ne peut être résolu qu'en utilisant la fonction « virtuelle ».
- Un « virtuel » est un mot-clé précédant la déclaration normale d'une fonction.
- Lorsque la fonction est rendue virtuelle, C++ détermine quelle fonction doit être invoquée au moment de l'exécution en fonction du type de l'objet pointé par le pointeur de classe de base.
Liaison tardive ou liaison dynamique
En cas de liaison tardive, l'appel de fonction est résolu pendant l'exécution. Par conséquent, le compilateur détermine le type d'objet au moment de l'exécution, puis lie l'appel de fonction.
Règles de fonction virtuelle
lire les fichiers json
- Les fonctions virtuelles doivent être membres d'une classe.
- Les fonctions virtuelles ne peuvent pas être des membres statiques.
- On y accède via des pointeurs d'objet.
- Ils peuvent être amis d’une autre classe.
- Une fonction virtuelle doit être définie dans la classe de base, même si elle n'est pas utilisée.
- Les prototypes d'une fonction virtuelle de la classe de base et toutes les classes dérivées doivent être identiques. Si les deux fonctions portent le même nom mais des prototypes différents, C++ les considérera comme des fonctions surchargées.
- Nous ne pouvons pas avoir de constructeur virtuel, mais nous pouvons avoir un destructeur virtuel
- Considérez la situation où nous n'utilisons pas le mot-clé virtuel.
#include using namespace std; class A { int x=5; public: void display() { std::cout << 'Value of x is : ' << x<<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>
Sortir:
Value of x is : 5
Dans l'exemple ci-dessus, * a est le pointeur de classe de base. Le pointeur ne peut accéder qu'aux membres de la classe de base mais pas aux membres de la classe dérivée. Bien que C++ permette au pointeur de base de pointer vers n'importe quel objet dérivé de la classe de base, il ne peut pas accéder directement aux membres de la classe dérivée. Par conséquent, il existe un besoin d’une fonction virtuelle permettant au pointeur de base d’accéder aux membres de la classe dérivée.
Exemple de fonction virtuelle C++
Voyons l'exemple simple d'une fonction virtuelle C++ utilisée pour appeler la classe dérivée dans un programme.
#include { public: virtual void display() { cout << 'Base class is invoked'<<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>
Sortir:
Derived Class is invoked
Fonction virtuelle pure
- Une fonction virtuelle n’est utilisée pour effectuer aucune tâche. Il sert uniquement d'espace réservé.
- Lorsque la fonction n'a pas de définition, cette fonction est appelée ' ne fais rien ' fonction.
- Le ' ne fais rien 'la fonction est connue sous le nom de fonction virtuelle pure . Une fonction virtuelle pure est une fonction déclarée dans la classe de base qui n'a pas de définition relative à la classe de base.
- Une classe contenant la fonction virtuelle pure ne peut pas être utilisée pour déclarer ses propres objets, ces classes sont appelées classes de base abstraites.
- L'objectif principal de la classe de base est de fournir les traits aux classes dérivées et de créer le pointeur de base utilisé pour réaliser le polymorphisme d'exécution.
La fonction virtuelle pure peut être définie comme :
virtual void display() = 0;
Voyons un exemple simple :
police de caractères
#include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout << 'Derived class is derived from the base class.' <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>
Dans l'exemple ci-dessus, la classe de base contient la fonction virtuelle pure. La classe de base est donc une classe de base abstraite. Nous ne pouvons pas créer l'objet de la classe de base.