Latest web development tutorials

C de la polymorphisme

Polymorphisme signifie littéralement qu'une variété de formes.Lorsque l'association entre la classe par héritage entre la hiérarchie de classe, et sera utilisé polymorphisme.

Lorsque C fonction membre ++ appelle moyenne polymorphes, sera d'effectuer des fonctions différentes selon le type d'objet la fonction est appelée.

L'exemple suivant, la forme de la classe de base est calculée pour les deux catégories, comme suit:

#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 produit les résultats suivants:

Parent class area
Parent class area

La cause de l'erreur est sortie, appeler la zone de fonction () est définie comme la version du compilateur de classe de base, ce qu'on appelle lepolymorphisme statique, ou un lien statique- fonction appelée avant la mise en œuvre du programme est prêt. Parfois , il est aussi appeléliaison anticipée parce que la fonction zone () lors de la compilation du programme a été mis en place.

Mais maintenant, laisser le programme légèrement modifié dans la classe Shape, la première zone () déclaration lieu le mot - clévirtuelle, 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, lorsqu'il est compilé et exécuté en face de l'exemple de code, il va produire les résultats suivants:

Rectangle class area
Triangle class area

Dans ce cas, le compilateur est un pointeur pour voir le contenu, plutôt que son type. En conséquence, depuis le tri de stockage d'adresse et objets de classe rec en * forme, et il appellera la fonction zone respective ().

Comme vous pouvez le voir, chaque classe dispose d'un espace sous-fonction () pour obtenir l'indépendance. Ceci est une utilisation généralepolymorphes.Avec le polymorphisme, vous pouvez avoir plusieurs classes différentes, tous avec le même nom mais un paramètre de la fonction, la fonction peut même avoir des implémentations différentes de la même chose.

fonction virtuelle

fonction virtuelle est déclarée en utilisant le mot - clé virtueldans la fonction de la classe de base. Lorsque la fonction virtuelle de classe de base redefine définie dans une classe dérivée, il indique au compilateur de ne pas statiquement lié à la fonction.

Ce que nous voulons est un point quelconque dans le programme peut être sélectionné en fonction du type d'appels de fonction d'objet invoqué, cette opération est appeléeliaison dynamique, ou la liaison tardive.

fonction virtuelle pure

Vous pouvez définir une fonction virtuelle dans la classe de base, de sorte que la classe dérivée de redéfinir la fonction mieux adaptée à l'objet, mais vous ne pouvez pas donner une mise en œuvre efficace des fonctions virtuelles dans la classe de base, cette fois il y aura utiliser la fonction virtuelle pure.

Nous pouvons baser la zone de fonction virtuelle de classe () 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, au- dessus de la fonction virtuelle est unefonction virtuelle pure.