Latest web development tutorials

C ++ il polimorfismo

Polimorfismo significa letteralmente che una varietà di forme.Quando verrà utilizzata l'associazione tra la classe attraverso l'ereditarietà tra gerarchia di classe, e il polimorfismo.

Quando funzione membro C ++ chiama medio polimorfica, sarà per eseguire funzioni diverse a seconda del tipo di oggetto la funzione viene chiamata.

Nel seguente esempio, la forma classe base è derivata per le due categorie, come segue:

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

Quando il codice di cui sopra è compilato ed eseguito, produce i seguenti risultati:

Parent class area
Parent class area

La causa dell'errore è uscita, chiamare la zona di funzione () è impostato come la versione del compilatore classe base, questo è chiamatopolimorfismo statico, o collegamento statico- funzione chiamata prima che l'attuazione del programma è pronto. A volte è anche chiamatol'associazione anticipata in quanto la funzione area () durante la compilazione del programma è stato istituito.

Ma ora, lasciare che il programma leggermente modificato nella classe Shape, la prima area () posto dichiarazione la parola chiavevirtuale, come segue:

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

Dopo la modifica, se compilato ed eseguito davanti al codice di esempio, produrrà i seguenti risultati:

Rectangle class area
Triangle class area

In questo caso, il compilatore è un puntatore per vedere il contenuto, piuttosto che il suo tipo. Di conseguenza, poiché il tri stoccaggio indirizzo e oggetti di classe rec in * forma, e si chiamerà la funzione rispettiva area ().

Come si può vedere, ogni classe ha una zona sub-function () per ottenere l'indipendenza. Questo è un uso generalepolimorfico.Con il polimorfismo, si possono avere diverse classi differenti, tutti con lo stesso nome ma un parametro della funzione, la funzione può anche avere diverse implementazioni dello stesso.

funzione virtuale

funzione virtuale è dichiarata usando la parola chiave virtualenella funzione di classe di base. Quando funzione virtuale della classe base ridefinire definita in una classe derivata, si dice al compilatore non staticamente legata alla funzione.

Quello che vogliamo è un qualsiasi punto del programma può essere selezionato in base al tipo di chiamate di funzione oggetto invocato, questa operazione si chiamacollegamento dinamico o tardiva.

funzione virtuale pura

Si potrebbe voler definire una funzione virtuale nella classe base, in modo da classe derivata ridefinire la funzione più adatto per l'oggetto, ma non si può dare una implementazione significativo di funzioni virtuali nella classe base, questa volta ci sarà utilizzare la funzione virtuale pura.

Siamo in grado di basare la classe virtuale zona function () come segue:

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 indica al compilatore che la funzione non ha un corpo, sopra la funzione virtuale è unafunzione virtuale pura.