O que é polimorfismo?

Polimorfismo é um dos conceitos mais importantes da Programação Orientada a Objetos ( OOPs) . Para uma linguagem considerada uma linguagem OOP, ela deve suportar polimorfismo. Você pode descrever a palavra polimorfismo como um objeto com muitas formas. Polimorfismo é a noção que pode sustentar a habilidade de um objeto de uma classe de mostrar respostas diferentes. Em outras palavras, você pode dizer que polimorfismo é a capacidade de um objeto ser representado em mais de uma forma.

Para entender o polimorfismo, você pode considerar um exemplo da vida real. Você pode relacionar isso ao relacionamento de uma pessoa com pessoas diferentes. Um homem pode ser pai de alguém, marido, chefe, empregado, filho, irmão ou pode ter muitos outros relacionamentos com várias pessoas. Aqui, este homem representa o objeto, e seus relacionamentos mostram a capacidade desse objeto de ser representado em muitas formas com características totalmente diferentes.

O polimorfismo em C ++ é amplamente classificado em dois categorias com base em seus recursos característicos que você explorará mais neste artigo. Essas categorias são:

  • Polimorfismo de tempo de compilação
  • Polimorfismo de tempo de execução.

Adicionar outra estrela à sua avaliação de desempenho

Aprenda com especialistas do setor GRATUITAMENTE Comece a aprender

Adicionar outra estrela à sua avaliação de desempenho

Por que você precisa usar o polimorfismo?

O polimorfismo tem vários benefícios associados a ele. Um deles é que ajuda você a escrever o código de forma consistente. Por exemplo, suponha que você queira encontrar a área de um círculo e um retângulo. Para isso, sua primeira abordagem será criar uma classe base que tratará do tipo de polígono. Esta classe base contém duas classes derivadas, uma para o círculo e outra para o retângulo. Agora, em vez de declarar duas funções separadas com nomes separados em ambas as classes derivadas para calcular a área de cada polígono, você pode simplesmente declarar uma função na classe base e substituí-la nas classes filhas para calcular a área. Dessa forma, você aumenta a consistência do código usando polimorfismo.

Tipos de polimorfismo

Com base na funcionalidade, você pode categorizar o polimorfismo em dois tipos:

  • Polimorfismo em tempo de compilação

Quando a relação entre a definição de diferentes funções e suas chamadas de função, é determinada durante o tempo de compilação, é conhecido como polimorfismo de tempo de compilação. Este tipo de polimorfismo também é conhecido como polimorfismo estático ou de ligação inicial. Todos os métodos de polimorfismo de tempo de compilação são chamados ou invocados durante o tempo de compilação.

Você pode implementar o polimorfismo em tempo de compilação usando sobrecarga de função e sobrecarga de operador. A sobrecarga de método/função é uma implementação do polimorfismo de tempo de compilação onde o mesmo nome pode ser atribuído a mais de um método ou função, tendo diferentes argumentos ou assinaturas e diferentes tipos de retorno. O polimorfismo em tempo de compilação tem uma taxa de execução muito mais rápida, pois todos os métodos que precisam ser executados são chamados durante o tempo de compilação. No entanto, é menos preferido para lidar com problemas complexos, uma vez que todos os métodos e detalhes vêm à luz apenas durante o tempo de compilação. Portanto, a depuração se torna mais difícil.

A implementação do polimorfismo em tempo de compilação é obtida de duas maneiras:

  • Sobrecarga de função
  • Sobrecarga do operador

Antes de discuti-los, é essencial entender sua outra contraparte, que é o polimorfismo em tempo de execução.

  • Polimorfismo de tempo de execução

No polimorfismo de tempo de execução, o compilador resolve o objeto em tempo de execução e então decide qual chamada de função deve ser associada a esse objeto. É também conhecido como polimorfismo dinâmico ou de ligação tardia. Este tipo de polimorfismo é executado por meio de funções virtuais e sobreposição de funções. Todos os métodos de polimorfismo de tempo de execução são invocados durante o tempo de execução.

Substituição de método é uma aplicação de polimorfismo de tempo de execução onde duas ou mais funções com o mesmo nome, argumentos e tipo de retorno acompanham diferentes classes da mesma estrutura. Este método tem uma taxa de execução comparativamente mais lenta do que o polimorfismo de tempo de compilação, uma vez que todos os métodos que precisam ser executados são chamados durante o tempo de execução. O polimorfismo de tempo de execução é conhecido por ser melhor para lidar com problemas complexos, uma vez que todos os métodos e detalhes aparecem durante o próprio tempo de execução.

A implementação do polimorfismo em tempo de execução pode ser alcançada de duas maneiras:

  • Substituição de função
  • Funções virtuais

Maneiras de implementar o polimorfismo de tempo de compilação em C ++

Em C ++, você pode implementar o polimorfismo em tempo de compilação de duas maneiras. Nesta seção, você os explorará em detalhes.

  • Sobrecarga de função

A sobrecarga de funções é um pilar importante do polimorfismo em C ++. Quando o mesmo nome de função está sobrecarregado com várias tarefas, essa função fica sobrecarregada. Em outras palavras, a sobrecarga de função ocorre quando você cria duas funções com o mesmo nome e essas funções têm finalidades diferentes. Ambas as funções devem ter os mesmos tipos de retorno e argumentos estritamente diferentes entre si. Isso é alcançado durante o tempo de compilação. A sobrecarga de função pode ocorrer tanto na classe base quanto na classe derivada.

Todas as funções que foram sobrecarregadas compartilham o mesmo escopo. Uma vez que é alcançável na classe base e na classe derivada, você não precisa especificamente de herança.

Sintaxe

//funções do mesmo nome com argumentos diferentes

int func (int var) {}

int func (float var) {}

O programa a seguir ilustra o polimorfismo em tempo de compilação usando sobrecarga de função:

#include

usando namespace std;

classe functionOverloadingExample

{

público:

//função com 1 parâmetro interno

void myFunc (int a)

{

cout <<"a="<

}

//myFunction com o mesmo nome, mas 1 parâmetro duplo

void myFunc (double a)

{

cout <<"a="<

}

//myFunction com o mesmo nome e 2 parâmetros internos

void myFunc (int a, int b)

{

cout <<"a="<

}

};

int main () {

functionOverloadingExample obj;

//Qual myFunction é chamado dependerá dos parâmetros passados ​​

//O primeiro’myFunc’é chamado

obj.myFunc (10);

//O segundo’myFunc’é chamado

obj.myFunc (10.20);

//O terceiro’myFunc’é chamado

obj.myFunc (100, 200);

return 0;

}

PolymorphisminC_Plus_Plus_1

No programa acima, existem três funções com o mesmo nome myFunc, mas com argumentos diferentes. Quando uma chamada de função é feita, o compilador decide a função que deve ser chamada combinando os parâmetros passados. Portanto, quando você passa um valor inteiro 10, ele chama a função mFunc (int a).

  • Sobrecarga do operador

A sobrecarga do operador às vezes também é chamada de polimorfismo ad-hoc. Na sobrecarga do operador, diferentes operadores exibem diferentes implementações com base em seus parâmetros ou assinaturas. A linguagem de programação C ++ permite criar operadores que podem servir a propósitos específicos com funções definidas pelo usuário. Essa capacidade do C ++ de criar operadores com um significado específico para tipos de dados é chamada de sobrecarga de operador.

Um exemplo simples e comum de sobrecarga de operador é quando você usa o operador “+” entre duas ou mais strings. É usado para uni-los ou concatená-los. Alguns outros casos de uso de sobrecarga de operador estão trabalhando com números fracionais, números complexos, inteiros grandes, etc.

Sintaxe

class class_name {

público

símbolo do operador return_type (argumentos) {

//defina a função

}

};

O programa a seguir ilustra o polimorfismo em tempo de compilação usando sobrecarga de operador:

#include

usando namespace std;

//definir uma classe

classe operatorOverlaodingExample

{

privado:

int myVar;

público:

operatorOverlaodingExample (): myVar (8) {}

operador void ++ () {

minhaVar=minhaVar + 20;

}

void display () {

cout <<"O valor atualizado é:"<

cout <<"\ n \ n";

}

};

int main ()

{

operatorOverlaodingExample obj;

//chame a função”operador viod +++ ()”

++ obj;

obj.display ();

return 0;

}

PolymorphisminC_Plus_Plus_2

A principal diferença entre as funções normais e as funções do operador é que o nome das funções do operador é seguido pela palavra-chave “operador” junto com o símbolo do operador que você deseja sobrecarregar. Essas funções de operador são invocadas quando seus operadores correspondentes são usados ​​no programa.

Você pode sobrecarregar quase todos os operadores suportados pelo C ++, mas existem algumas exceções. Esses operadores de exceção são:

  • . (operador de ponto)
  • :: (operador de escopo)
  • ?: (operador ternário)
  • tamanho de

Alguns pontos-chave sobre sobrecarga do operador:

  • Para sobrecarregar um operador, é necessário que pelo menos um operando seja um objeto de uma classe definida pelo usuário.
  • Na sobrecarga do operador, um operador de atribuição padrão é criado com cada classe automaticamente pelo compilador.
  • C ++ permite que você crie operadores de conversão que podem converter um tipo de operador em outro tipo.

#include

usando namespace std;

//define uma classe para converter inteiros em flutuantes

classe convertFloat

{

dividendo int, divisor;

público:

//construtor

convertFloat (int D, int d)

{

dividendo=D;

divisor=d;

}

//este é um operador de conversão

//converterá um número inteiro em flutuante

//e devolva

operador float () const {

return float (dividendo)/float (divisor);

}

};

int main () {

//chame a operadora

convertFloat f (5, 9);

float result=f;

//imprimir o resultado

cout <

cout <<"\ n \ n";

return 0;

}

PolymorphisminC_Plus_Plus_3

  • Os construtores que têm um único argumento também atuam como um operador de conversão.

#include

usando namespace std;

//definir uma classe

coordenadas de classe

{

privado:

int x1, y1;

público:

//construtor da classe

coordenadas (int x_coord=0, int y_coord=0) {

x1=x_coord;

y1=y_coord;

}

void displayCoordinates () {

cout <<"\ n";

cout <<"A coordenada x="<

}

};

int main () {

ponto de coordenadas (100, 100);

point.displayCoordinates ();

//x será 30 e y será 0

ponto=30;

point.displayCoordinates ();

return 0;

}

PolymorphisminC_Plus_Plus_4

Maneiras de implementar polimorfismo em tempo de execução em C ++

Em C ++, você pode implementar o polimorfismo em tempo de execução de duas maneiras. Nesta seção, você verá os dois em detalhes.

  • Substituição de função

A substituição da função ocorre quando a classe derivada e a classe base contêm uma função com o mesmo nome. Junto com o mesmo nome, ambas as funções devem ter o mesmo número de argumentos, bem como o mesmo tipo de retorno. A classe derivada herda as funções de membro e membros de dados de sua classe base. Portanto, para substituir uma determinada funcionalidade, você deve executar a substituição de função. Isso é alcançado durante o tempo de execução.

As funções que são substituídas adquirem escopos diferentes. Para anular a função, a herança é uma necessidade. Isso só pode acontecer em uma classe derivada. Se uma classe não for herdada de outra classe, você não poderá obter a substituição de função. Para resumir, uma função é substituída quando você deseja realizar uma tarefa complementar à função da classe base.

O programa a seguir ilustra o polimorfismo do tempo de execução usando a substituição de função:

#include

usando namespace std;

//definir uma classe base

pássaro da classe

{

público:

//exibe a função da classe base

void display ()

{

cout <<"Eu sou a função de exibição da classe base";

cout <<"\ n \ n";

}

};

papagaio de classe: pássaro público

{

público:

//exibir função da classe servida

//esta função exibirá ()

//da substituição da classe base em tempo de execução

void display ()

{

cout <<"Eu sou a função de exibição da classe derivada";

cout <<"\ n \ n";

}

};

int main ()

{

//criar objetos de classes base e filho

pássaro b;

papagaio p;

//chame a função diplay ()

b.display ();

p.display ();

}

PolymorphisminC_Plus_Plus_5

  • Funções virtuais

As funções virtuais são as funções de membro da classe base que são substituídas em uma classe derivada. Quando você faz uma chamada para essa função usando um ponteiro ou referência à classe base, a função virtual é chamada e a versão da classe derivada da função é chamada.

Alguns pontos-chave sobre funções virtuais

  • As funções virtuais são apenas dinâmicas
  • Eles são declarados dentro de uma classe base usando a palavra-chave “virtual”
  • Essas funções são chamadas durante o tempo de execução
  • As funções virtuais são sempre declaradas com uma classe base e substituídas em uma classe filha
  • As funções virtuais podem existir na ausência de herança. Nesse caso, a versão da classe base da função será chamada

O programa a seguir ilustra o polimorfismo em tempo de execução usando uma função virtual:

#include

usando namespace std;

//define um pássaro da classe base

pássaro da classe {

público:

//função virtual

display vazio virtual ()

{

cout <<"Isso é exibido na classe de pássaros."<<"\ n \ n";

}

void print ()

{

cout <<"Isso é mostrado na classe de pássaros."<<"\ n \ n";

}

};

//definir um papagaio de classe infantil

papagaio de classe: pássaro público {

público:

void display ()

{

cout <<"Esta é a exibição na classe de papagaios."<<"\ n \ n";

}

void print ()

{

cout <<"Isso é mostrado na aula de papagaios."<<"\ n \ n";

}

};

int main ()

{

//cria uma referência para a classe bird

bird * brd;

papagaio p;

brd=& p;

//isso irá chamar a função virtual

brd-> display ();

//isso irá chamar a função não virtual

brd-> print ();

}

PolymorphisminC_Plus_Plus_6

Polimorfismo de tempo de compilação vs. tempo de execução em C ++

As principais diferenças entre o polimorfismo em tempo de compilação e o polimorfismo em tempo de execução estão resumidas abaixo:

TEMPO DE COMPILAÇÃO

TEMPO DE EXECUÇÃO

O polimorfismo em tempo de compilação também é conhecido como polimorfismo estático ou de ligação inicial.

O polimorfismo em tempo de execução também é conhecido como polimorfismo dinâmico ou de ligação tardia.

As chamadas de função são resolvidas pelo compilador.

As chamadas de função não são resolvidas pelo compilador.

O polimorfismo de tempo de compilação oferece menos flexibilidade para os programadores, já que tudo é executado durante a compilação.

Em contraste, o polimorfismo em tempo de execução é mais flexível, pois tudo é executado durante o tempo de execução.

Pode ser implementado por meio de sobrecarga de função e sobrecarga de operador.

Ele pode ser implementado por meio de funções virtuais e substituição de função.

A sobrecarga de método é uma aplicação de polimorfismo de tempo de compilação em que o mesmo nome pode ser comissionado entre mais de um método de funções com argumentos ou assinaturas diferentes e os mesmos tipos de retorno.

A substituição de método é um aplicativo de polimorfismo de tempo de execução em que duas ou mais funções com o mesmo nome, argumentos e tipo de retorno acompanham diferentes classes da mesma estrutura.

Este método tem uma taxa de execução muito mais rápida, pois todos os métodos que precisam ser executados são chamados durante o tempo de compilação.

Este método tem uma taxa de execução comparativamente mais lenta, pois todos os métodos que precisam ser executados são chamados durante o tempo de execução.

Este método é menos preferido para lidar com problemas compostos, uma vez que todos os métodos e detalhes vêm à luz apenas durante o tempo de compilação.

Este método é conhecido por ser melhor para lidar com problemas compostos, uma vez que todos os métodos e detalhes aparecem durante o tempo de execução.

Você é um desenvolvedor web ou está interessado em construir um site? Inscreva-se no Desenvolvedor Full Stack Web-Programa MEAN Stack Master . Explore a visualização do curso!

Reflexões finais

Neste artigo, você aprendeu tudo o que precisa saber sobre polimorfismo em C ++. Você viu a importância do polimorfismo e por que ele é necessário para C ++. Este artigo mergulhou profundamente nos usos, tipos, maneiras de implementá-lo e todos os outros conceitos importantes e relacionados de polimorfismo. Você explorou como implementar o polimorfismo em tempo de compilação usando sobrecarga de função e sobrecarga de operador. Você também viu como implementar o polimorfismo de tempo de execução usando a substituição de métodos e funções virtuais.

Para entender melhor toda a linguagem de programação C ++, você pode consultar nosso guia em Programação C ++ para iniciantes .

Por que parar aqui? Aproveite nosso curso sobre Full Stack Web Development para aprenda tecnologias e habilidades de tendência e dê a si mesmo a chance de trabalhar para os maiores gigantes da tecnologia. Este curso irá guiá-lo através de tecnologias/habilidades completas que o ajudarão a entrar no desenvolvimento profissional da Web. Isso inclui Java , DevOps , Agilidade , HTML , AWS , etc.

Além disso, verifique a lista completa de cursos online gratuitos da Simplilearn.

Se você tiver alguma pergunta para nós, mencione-a na seção de comentários e nossos especialistas responderão para você.

Boa aprendizagem!

Source link

Categories: Wordpress