Latest web development tutorials

polimorfismo C ++

Polimorfismo significa, literalmente, que uma variedade de formas.Quando a associação entre a classe através de herança entre hierarquia de classe, e será utilizado polimorfismo.

Quando a função de membro C ++ chama média polimórfica, vai para executar funções diferentes, dependendo do tipo de objeto a função é chamada.

O exemplo a seguir, a forma classe base é derivado para as duas categorias, como se 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 o código acima é compilado e executado, ele produz os seguintes resultados:

Parent class area
Parent class area

A causa do erro é emitido, chamar a área de function () é definida como a versão do compilador classe base, isto é chamadopolimorfismo estático, ou link estático- função chamada antes da implementação do programa está pronto. Às vezes também é chamado deligação antecipada porque a função area () durante a compilação do programa foi criado.

Mas agora, deixe o programa foi ligeiramente modificado na classe Shape, a primeira área () declaração lugar a palavra-chavevirtual, como 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;
      }
};

Após a modificação, quando compilado e executado na frente do código de exemplo, que irá produzir os seguintes resultados:

Rectangle class area
Triangle class area

Neste caso, o compilador é um ponteiro para ver o conteúdo, em vez de o seu tipo. Assim, desde o tri de armazenamento de endereços e objetos de classe rec em * forma, e ele irá chamar a função respectiva área ().

Como você pode ver, cada classe tem uma área de sub-function () para conseguir a independência. Este é o uso geralpolimórfica.Com o polimorfismo, você pode ter várias classes diferentes, todos com o mesmo nome, mas um parâmetro da função, a função pode até ter diferentes implementações da mesma.

função virtual

função virtual é declarado usando a palavra-chave virtualna função de classe base. Quando função virtual classe base redefine definido em uma classe derivada, diz o compilador não estaticamente ligado à função.

O que queremos é qualquer ponto do programa pode ser escolhido de acordo com o tipo de chamadas de função objeto invocado, esta operação é chamada deligação dinâmica, ou ligação tardia.

função virtual pura

Você pode querer definir uma função virtual na classe base, de modo classe derivada redefinir a função mais adequada para o objeto, mas você não pode dar uma implementação significativa de funções virtuais na classe base, desta vez haverá usar a função virtual pura.

Podemos basear classe área de função virtual () para ler da seguinte forma:

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 informa o compilador que a função não tem corpo, acima da função virtual é umafunção virtual pura.