Latest web development tutorials

Polimorfizm C ++

Polimorfizm dosłownie, że wiele różnych form.Gdy związek między klasą drodze dziedziczenia między klasowej hierarchii, i będą wykorzystywane polimorfizm.

Gdy funkcja składowa C ++ nazywa polimorficzny znaczy, będą wykonywać różne funkcje w zależności od rodzaju obiektu, funkcja zostanie wywołana.

Poniższy przykład kształt klasa bazowa pochodzi z dwóch kategorii, co następuje:

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

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

Parent class area
Parent class area

Przyczyną błędu jest wyświetlany, skontaktuj się z obszaru funkcji () jest ustawiony jako klasy bazowej wersji kompilatora, jest to tzwstatycznego polimorfizm lub statycznego Link- funkcji o nazwie przed wdrożeniem programu jest gotowy. Czasem nazywana jest takżewczesne wiązanie, ponieważ funkcja Obszar () podczas kompilacji programu została utworzona.

Ale teraz niech program nieco zmodyfikowany w klasie Shape, pierwszy obszar () miejsce rachunekwirtualny słów kluczowych,co następuje:

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

Po modyfikacji po opracowaniu i wykonywane przed numerem przykładu, pojawia się następujące wyniki:

Rectangle class area
Triangle class area

W tym przypadku, kompilator jest wskaźnikiem, aby zobaczyć treść, a nie jego typu. W związku z powyższym, ponieważ tri przechowywania adres i rec obiektów klasy * w kształcie, a to wywołanie funkcji danego obszaru ().

Jak widać, każda klasa ma pole sub-function (), aby osiągnąć niezależność. Jest topolimorficzny ogólnego użytku.Z polimorfizmem, można mieć kilka różnych klas, wszystkie o tej samej nazwie, ale parametr funkcji, funkcja ta może nawet mieć różne implementacje tego samego.

funkcja virtual

Funkcja Virtual jest zadeklarowana za pomocą słowa kluczowego wirtualnyw funkcji klasy bazowej. Gdy klasa podstawowa funkcja wirtualnego Redefine zdefiniowana w klasie pochodnej, to informuje kompilator nie statycznie połączony z funkcji.

Chcemy dowolny punkt w programie może być dobrany odpowiednio do rodzaju wywołań funkcji Wywołany obiekt, operacja ta nazywana jestdynamiczne łączenie lub późnego wiązania.

Czysta funkcja wirtualna

Możesz chcieć zdefiniować funkcję wirtualną w klasie bazowej, więc klasa pochodna przedefiniować funkcję lepiej nadaje się do obiektu, ale nie może dać znaczące realizację funkcji wirtualnych w klasie bazowej, tym razem nie będzie wykorzystywać czystą funkcję wirtualną.

Możemy oprzeć klasy obszar wirtualny function () w brzmieniu:

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 informuje kompilator, że funkcja nie ma ciała, powyżej funkcja wirtualna jestczystą funkcją wirtualną.