Latest web development tutorials

C ++ polymorphism

Polymorphismus bedeutet wörtlich , dass eine Vielzahl von Formen.Wenn die Verbindung zwischen der Klasse durch Vererbung zwischen Klassenhierarchie und Polymorphismus verwendet werden.

Wenn C ++ Elementfunktion polymorphen Mittelwert bezeichnet werden verschiedene Funktionen in Abhängigkeit vom Typ des Objekts auszuführen, um die Funktion aufgerufen wird.

Das folgende Beispiel ist die Basisklasse Form ist für die beiden Kategorien abgeleitet, wie folgt:

#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;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

Parent class area
Parent class area

Die Ursache des Fehlers ausgegeben, rufen Sie den Funktionsbereich () wird als Basisklasse Compiler - Version gesetzt, diesestatische Polymorphismus genannt wird,oderstatischer Link- Funktion aufgerufen , bevor die Umsetzung des Programms bereit ist. Manchmal ist es auch diefrühe Bindung , weil die Fläche () Funktion während der Programmzusammenstellung wurde eingerichtet, genannt.

Aber jetzt lassen Sie das Programm leicht in der Shape - Klasse geändert, wobei der erste Bereich () Anweisung Ort , um das Schlüsselwortvirtual, wie folgt:

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;
      }
};

Nach der Änderung beim Kompilieren und vor dem Beispielcode ausgeführt wird, wird es die folgenden Ergebnisse erzielt:

Rectangle class area
Triangle class area

In diesem Fall ist der Compiler einen Zeiger, den Inhalt zu sehen, anstatt seinen Typ. Dementsprechend kann, da die Adressspeicher tri und rec Klassenobjekte in * Form, und es wird den jeweiligen Bereich () Funktion aufrufen.

Wie Sie sehen können, hat jede Klasse eine Unterfunktion Bereich () auf Unabhängigkeit zu erreichen. Dies istpolymorphen allgemeinen Gebrauch.Mit Polymorphismus können Sie mehrere verschiedene Klassen haben, die alle mit dem gleichen Namen, aber einen Parameter der Funktion kann die Funktion auch verschiedene Implementierungen des gleichen haben.

Virtuelle Funktion

Virtuelle Funktion wird mit dem Schlüsselwort deklariert virtuellenin der Funktion der Basisklasse. Wenn neu zu definieren Funktion in einer abgeleiteten Klasse definierten virtuellen Basisklasse, teilt es dem Compiler nicht statisch mit der Funktion verknüpft.

Was wir wollen , jeder Punkt im Programm ist , kann je nach der Art von Objekt - Funktionsaufrufe aufgerufen ausgewählt werden, wird dieser Vorgangdynamische Verknüpfung oder späte Bindung bezeichnet.

Rein virtuelle Funktion

Sie können eine virtuelle Funktion in der Basisklasse definieren wollen, so abgeleitete Klasse die Funktion besser geeignet für das Objekt neu zu definieren, aber Sie können nicht eine sinnvolle Umsetzung von virtuellen Funktionen in der Basisklasse, diesmal dort geben wird verwenden Sie rein virtuelle Funktion.

Wir können Klasse virtuelle Funktionsbereich () basieren wie folgt zu lesen:

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 teilt dem Compiler mit, dass die Funktion keinen Körper hat, über die virtuelle Funktion einerein virtuelle Funktion ist.