polymorphisme
Le polymorphisme est l'une des caractéristiques importantes de la programmation orientée objet. Le sens littéral peut être simplement compris comme : formes multiples, apparences multiples. En fait, la signification essentielle est la même. En programmation orientée objet, cela signifie que la même méthode aura des effets d'exécution différents lorsqu'elle sera exécutée par différents objets.
Plus précisément, l’implémentation du polymorphisme peut être divisée en deux types : le polymorphisme au moment de la compilation et le polymorphisme au moment de l’exécution. Le premier est le processus opérationnel spécifique déterminé lors de la compilation, et le second est le processus opérationnel qui n'est déterminé que lors de l'exécution du programme. Cette détermination du processus d'exploitation est contraignante , également appelée contraignante .
La liaison confirmée lors de la compilation et de la connexion est appelée liaison statique . La surcharge de fonctions et l'instanciation des modèles de fonctions que nous avons apprises précédemment entrent dans cette catégorie. L'autre consiste à confirmer quel morceau de code est exécuté lors de son exécution, ce qu'on appelle liaison dynamique . Dans ce cas, il n'est pas possible de confirmer quel morceau de code est exécuté lors de la compilation, mais ne peut être confirmé qu'après l'exécution du programme. courir.
En comparant les deux, la liaison statique a déjà déterminé comment l'exécuter lors de la compilation, elle est donc efficace en exécution tandis que la liaison dynamique doit être plus lente, mais son avantage est la flexibilité. Les deux ont leurs propres mérites et différents scénarios d’utilisation.
Ci-dessous, nous allons vous donner un exemple simple autour des liens statiques :
/************************************//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;}doublearea(){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;}
Deux classes sont définies, une classe de points et une classe de cercle dérivée. Vous pouvez voir le code de la fonction principale et les quatre résultats de la zone de sortie. Les résultats sont les suivants :
Vous pouvez comparer le code pour comprendre les quatre sorties :
Le premier cout affiche l'aire de A, qui est la méthode d'aire dans la classe Point. L'aire est 0, donc il n'y a pas de problème.
Le deuxième cout génère l'aire de B, qui est évidemment la méthode d'aire de la classe dérivée Circle. L'aire est naturellement calculée selon la formule et la valeur est de 1256,64, ce qui ne pose pas de problème.
Le troisième cout génère la méthode de zone de l'objet de classe Circle pointé par le pointeur de type Point p. Il génère 0, qui est évidemment la méthode de zone dans la classe Point. Ce que C++ implémente ici est une liaison statique, c'est-à-dire que lors de la compilation, il détermine quelle zone exécuter en fonction du type de p, c'est donc 0.
Le quatrième type de cout fonctionne de la même manière. Il attribue un objet de type Circle à une référence de type Point C++ effectue également une liaison statique et génère également 0.
Évidemment, ce n'est pas le résultat que nous attendons. En fait, pour les pointeurs et les références, nous préférons exécuter les méthodes des objets réels, plutôt que de déterminer aveuglément les types de pointeurs et de références. C'est le problème s'il est écrit comme ceci.
Si vous souhaitez répondre à nos exigences, quel que soit le type de pointeur ou de référence, celui-ci doit être décidé de manière flexible en fonction de l'objet réel pointé. Ensuite, nous devons modifier cette méthode de liaison statique par défaut et utiliser la liaison dynamique, c'est-à-dire décidée de manière flexible au moment de l'exécution.
Dans la section suivante, les fonctions virtuelles seront expliquées en détail pour tout le monde !