Latest web development tutorials

polimorfismo C ++

Polimorfismo literalmente significa que una variedad de formas.Cuando se utiliza la asociación entre la clase a través de herencia entre jerarquía de clases, y el polimorfismo.

Cuando C ++ llama a la función miembro media polimórfica, será para realizar diferentes funciones dependiendo del tipo de objeto se llama la función.

En el siguiente ejemplo, la forma de la clase base se deriva de las dos categorías, como sigue:

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

Cuando el código se compila y ejecuta, produce los siguientes resultados:

Parent class area
Parent class area

La causa del error es la salida, llamar al área de función () se establece como la versión del compilador clase base, esto se llamapolimorfismo estática, o un enlace estático- función llamada antes de la ejecución del programa está listo. A veces también sedenomina enlace debido a que la función de área () durante la compilación del programa ha sido establecido.

Pero ahora, dejar que el programa modificado ligeramente en la clase Shape, la primera área () lugar comunicado la palabra clavevirtual, de la siguiente manera:

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

Después de la modificación, una vez recopilados y ejecutada frente al código de ejemplo, se producen los siguientes resultados:

Rectangle class area
Triangle class area

En este caso, el compilador es un puntero para ver el contenido, en lugar de su tipo. En consecuencia, dado que el tri almacenamiento de direcciones y objetos de la clase rec * en forma, y ​​se llamará a la función respectiva zona ().

Como se puede ver, cada clase tiene un área sub-función () para lograr la independencia. Esto es de uso generalpolimórfico.Con el polimorfismo, puede tener varias clases diferentes, todos con el mismo nombre pero con un parámetro de la función, la función puede incluso tener diferentes implementaciones de la misma.

función virtual

función virtual se declara usando la palabra clave virtualen la función de la clase base. Cuando función virtual clase base redefinen definido en una clase derivada, le dice al compilador no estáticamente vinculado a la función.

Lo que queremos es cualquier punto en el programa pueden ser seleccionados de acuerdo con el tipo de llamadas a funciones objeto invocado, esta operación se llamala vinculación dinámica, o el enlace en tiempo.

función virtual pura

Es posible que desee definir una función virtual en la clase base, por lo que la clase derivada redefinir la función más adecuada para el objeto, pero no se puede dar una aplicación significativa de las funciones virtuales en la clase base, esta vez no lo hará utilizar la función virtual pura.

Podemos basar clase área de función virtual () para que lea como sigue:

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 compilador que la función no tiene cuerpo, por encima de la función virtual es unafunción virtual pura.