Commençons par présenter notre nouveau point de connaissance : la fonction virtuelle .
De quel genre de fonction s'agit-il ? Pour faire simple, c'est une fonction déclarée avec virtual devant une fonction. La forme générale est la suivante :
valeur de retour de la fonction virtuelle nom de la fonction (paramètre formel) {corps de la fonction}
Alors à quoi ça sert ? L'émergence de fonctions virtuelles permet d'établir la connexion entre la fonction et le corps de la fonction au moment de l'exécution, ce qu'on appelle la liaison dynamique . Ensuite, lorsque la classe dérivée de la fonction virtuelle est en cours d'exécution, l'effet de l'exécution de la même méthode mais avec des résultats différents peut être obtenu en fonction de la liaison dynamique au moment de l'exécution, ce qu'on appelle le polymorphisme. De cette façon, il existe un moyen de résoudre le problème de la section précédente.
Ensuite, il nous suffit de déclarer la méthode Area dans la classe de base en tant que fonction virtuelle, puis tout pointeur ou référence de type Point dans la fonction principale peut être appelé en gras, et il n'y a pas lieu de s'inquiéter des problèmes de type. Parce qu'ils décideront quelle méthode appeler en fonction du type d'objet réel pour obtenir une liaison dynamique.
Le code est le suivant :
/************************************//Des : Démo du tutoriel C++//Auteur : Huang/ /Droit d'auteur : www.dotcpp.com//Date : 20/12/2017********************************* *** *******/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){this->x=x;this ->y = y;}virtualdoublearea(){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea (){ returnPI*r*r;}};intmain(){PointA(10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area ()< <endl;Point*p;p=&B;cout<<p->area()<<endl;Point&pp=B;cout<<pp.area()<<endl;return0;}
Après modification, compilez et exécutez comme suit :
Veuillez expérimenter sur votre propre ordinateur pour découvrir le rôle des fonctions virtuelles et du polymorphisme.
Les choses à noter sont :
1. Les fonctions virtuelles ne peuvent pas être des fonctions membres statiques ou des fonctions amies car elles n'appartiennent pas à un objet.
2. Les fonctions en ligne ne peuvent pas déterminer dynamiquement leur emplacement pendant l'exécution. Même si la fonction virtuelle est définie à l'intérieur de la classe, elle sera toujours considérée comme non en ligne lors de la compilation.
3. Le constructeur ne peut pas être une fonction virtuelle, et le destructeur peut être une fonction virtuelle et est généralement déclaré comme une fonction virtuelle.