Polymorphisme C++


Polymorphisme Signifie littéralement plusieurs formes. Le polymorphisme est utilisé lorsqu'il existe une hiérarchie entre les classes et que les classes sont liées par héritage.

Le polymorphisme C++ signifie que lorsqu'une fonction membre est appelée, différentes fonctions seront exécutées en fonction du type de l'objet appelant la fonction.

Dans l'exemple suivant, la classe de base Shape est dérivée en deux classes, comme indiqué ci-dessous :

#include <iostream> 
using namespace std;
 
class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};
class Rectangle: public Shape{
   public:
      Rectangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Rectangle class area :" <<endl;
         return (width * height); 
      }
};
class Triangle: public Shape{
   public:
      Triangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Triangle class area :" <<endl;
         return (width * height / 2); 
      }
};
// 程序的主函数
int main( )
{
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);

   // 存储矩形的地址
   shape = &rec;
   // 调用矩形的求面积函数 area
   shape->area();

   // 存储三角形的地址
   shape = &tri;
   // 调用三角形的求面积函数 area
   shape->area();
   
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produira les résultats suivants :

Parent class area
Parent class area

La raison de la sortie d'erreur est que la fonction appelante area() est définie par le compilateur sur la version dans la classe de base. C'est ce qu'on appelle le polymorphisme statique, ou liaison statique. - Les appels de fonction sont préparés avant l'exécution du programme. Ceci est parfois appelé liaison anticipée car la fonction Area() est définie lors de la compilation du programme.

Mais maintenant, modifions légèrement le programme. Dans la classe Shape, plaçons le mot-clé virtual avant la déclaration de area(), comme suit :

class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      virtual int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};

Après. modification, lorsque l'exemple de code précédent est compilé et exécuté, il produira le résultat suivant :

Rectangle class area
Triangle class area

À ce stade, le compilateur examine le contenu du pointeur, pas son type. Par conséquent, puisque les adresses des objets de classe tri et rec sont stockées dans *shape, les fonctions area() respectives sont appelées.

Comme vous pouvez le voir, chaque sous-classe a une implémentation indépendante de la fonction area(). C’est ainsi qu’on utilise généralement polymorphique. Avec le polymorphisme, vous pouvez avoir plusieurs classes différentes, toutes avec des fonctions portant le même nom mais des implémentations différentes, et les paramètres des fonctions peuvent même être les mêmes.

Fonction virtuelle

Fonction virtuelle est une fonction déclarée dans une classe de base à l'aide du mot-clé virtuel. Lorsque vous redéfinissez une fonction virtuelle définie dans une classe de base dans une classe dérivée, vous indiquez au compilateur de ne pas établir de lien statique avec la fonction.

Ce que nous voulons, c'est qu'à tout moment du programme, nous puissions sélectionner la fonction à appeler en fonction du type d'objet appelé. Cette opération est appelée liaison dynamique, ou <. 🎜>Ensemble de reliure tardive.

Fonction virtuelle pure

Vous souhaiterez peut-être définir une fonction virtuelle dans la classe de base afin de pouvoir la redéfinir dans la classe dérivée pour mieux travailler avec l'objet, mais vous avez Si un sens l'implémentation de fonctions virtuelles ne peut pas être donnée, des fonctions virtuelles pures seront utilisées pour le moment.

Nous pouvons réécrire la fonction virtuelle area() dans la classe de base comme suit :

class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      // pure virtual function
      virtual int area() = 0;
};

= 0 indique au compilateur que la fonction n'a pas de corps et que la fonction virtuelle ci-dessus est un

fonction virtuelle pure.