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.
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; } 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). 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; } 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: #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; } #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; } Em C ++, você pode implementar o polimorfismo em tempo de execução de duas maneiras. Nesta seção, você verá os dois em detalhes. 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 (); } 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. 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 (); } As principais diferenças entre o polimorfismo em tempo de compilação e o polimorfismo em tempo de execução estão resumidas abaixo: 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! 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!
Sobrecarga do operador
Alguns pontos-chave sobre sobrecarga do operador:
Maneiras de implementar polimorfismo em tempo de execução em C ++
Substituição de função
Funções virtuais
Alguns pontos-chave sobre funções virtuais
Polimorfismo de tempo de compilação vs. tempo de execução em C ++
TEMPO DE COMPILAÇÃO
TEMPO DE EXECUÇÃO
Reflexões finais