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.