![]() |
Um exemplo de Polimorfismo na biologia são as muitas formas dos leucócitos |
Polimorfismo
A palavra polimorfismo significa "muitas formas" e é utilizada em diferentes áreas do conhecimento para representar as diferentes formas de um mesmo objeto de estudo. Em computação polimorfismo é um dos quatro pilares da Programação Orientada a Objetos, juntamente com os conceitos de abstração, herança e encapsulamento.
Em linguagens de programação como o C++, o polimorfismo é o termo utilizado para explicar as diferentes implementações de uma mesma Classe ou de suas classes derivadas. Vejamos um exemplo de polimorfismo dentro de uma classe.
Polimorfismo dentro da classe
Digamos que eu queira criar a classe "formageometrica" e instanciar a partir dela diferentes objetos como círculos, quadrados, triângulos e retângulos. Como são diferentes formas geométricas, eu teria necessidade de usar diferentes atributos.
Um círculo não tem número de lados. Já um quadrado não tem base diferente de altura. Além disso, o cálculo da área seria diferente pra cada forma. Sendo assim, eu não poderia ter um método construtor único. Veja uma possível solução para esse problema:
- #include <iostream>
- #include <string>
- using namespace std;
- int main() {
- class formageometrica {
- public:
- int nlados;
- int lado;
- int base;
- int altura;
- int raio;
- float area;
- formageometrica(int x){
- raio=x;
- area=3.1415*raio*raio;
- }
- formageometrica(int x, int y){
- nlados=x;
- lado=y;
- area=lado*lado;
- }
- formageometrica(int x, int y, int z){
- nlados=x;
- base=y;
- altura=z;
- if (nlados==3){
- area=(base*altura)/2;
- }
- if (nlados==4){
- area=(base*altura);
- }
- }
- };
- formageometrica circulo(2);
- formageometrica quadrado(4,2);
- formageometrica triangulo(3,2,3);
- formageometrica retangulo(4,2,3);
- cout <<"Area do circulo : "<< circulo.area << "\n";
- cout <<"Area do quadrado : "<< quadrado.area << "\n";
- cout <<"Area do triangulo : "<< triangulo.area << "\n";
- cout <<"Area do retangulo : "<< retangulo.area << "\n";
- return 0;
- }
Nesse exemplo dentro da classe formageometrica eu criei três diferentes métodos construtores entre as linhas 14 a 33 e usei cores diferentes para destacá-los. Um para criar circulo, outro para criar quadrado e outro para criar triangulo e retangulo.
Essa talvez não seja a melhor solução para o problema, mas serve de exemplo para o polimorfismo, pois estou usando o construtor de três formas diferentes. No último método veja que eu usei uma estrutura if para diferentes possibilidades de cálculo de área.
Todos usaram a mesma classe, mas por usarem diferentes construtores foi possível passar um número de diferente de parâmetros no seu instanciamento e calcular a área de forma diferente para todos.
Esse foi um exemplo de polimorfismo dentro da classe, pois os três métodos construtores tinham o mesmo nome. No entanto, existe outra forma comum de polimorfismo que é no uso de classes derivadas.
Polimorfismo em classes derivadas
Agora outro exemplo mostrando diferentes comportamentos de um mesmo método em um classe derivada. Aqui eu tenho a superclasse aluno e dele foi derivada a subclasse bolsista. Eu usei um exemplo parecido quando expliquei heranças e expliquei que bolsista herdava os atributos da classe original, no caso aluno .
Aqui na superclasse eu crie um método chamado exame() com a finalidade de retornar para a instrução que o chamar o resultado do exame do aluno, isto é, o método devolve a string "aprovado" ou "reprovado" de acordo com a nota do aluno.
No mundo real, muitas vezes os alunos bolsistas de escolas particulares possuem critérios mais rígidos de aprovação, então para eles eu criei um outro método exame() onde o critério de aprovação exige uma nota maior.
Utilizei cores diferentes para destacar a região do código onde a classe e os diferentes métodos foram criados. Veja como ficou o exemplo:
- #include <iostream>
- #include <string>
- using namespace std;
- int main() {
- class aluno {
- public:
- string nome;
- int nota;
- string exame(int x){
- if (x>=5){
- return "aprovado";
- }
- else{
- return "reprovado";
- }
- }
- };
- class bolsista: public aluno {
- public:
- string exame(int x){
- if (x>=7){
- return "aprovado";
- }
- else{
- return "reprovado";
- }
- }
- };
- bolsista aluno1;
- aluno1.nome = "Gabriel";
- aluno1.nota = 5;
- cout <<"Nome : "<< aluno1.nome << "\n";
- cout <<"Nota : "<< aluno1.nota << "\n";
- cout <<"Exame: "<< aluno1.exame(aluno1.nota) << "\n";
- return 0;
- }
No exemplo eu instanciei na linha 30 o objeto aluno1 a partir da classe derivada bolsista e atribui nas linhas 31 e 32 valores para os atributos que ele herdou da superclasse aluno. Já na linha 35 eu chamei o método exame() e passei como atributo a nota 5 do aluno1.
Repare que o resultado foi "reprovado" porque não foi utilizado o método exame() que estava na superclasse aluno, mas sim o exame() da subclasse onde a nota de aprovação era 7, por isso a reprovação.
Isso é um exemplo de polimorfismo, pois apesar do mesmo nome, são dois métodos com comportamentos diferentes que estão em classes com uma relação de herança.
Caso fossem classes diferentes sem nenhuma herança, mesmo que os métodos tivessem os mesmo nomes isso NÃO seria polimorfismo. Exemplo de situação com métodos com o mesmo nome, mas que não é polimorfismo:
- #include <iostream>
- #include <string>
- using namespace std;
- int main() {
- class circulo{
- public:
- int raio;
- float area(int x){
- raio=x;
- return 3.1415*raio*raio;
- }
- };
- class quadrado{
- public:
- int lado;
- float area(int x){
- lado=x;
- return (lado*lado);
- }
- };
- circulo circulo1;
- circulo1.raio=2;
- quadrado quadrado1;
- quadrado1.lado=2;
- cout <<"Area do circulo : "<< circulo1.area(circulo1.raio) << "\n";
- cout <<"Area do quadrado : "<< quadrado1.area(quadrado1.lado) << "\n";
- return 0;
- }
Com esses exemplos eu finalizei o quarto pilar da POO e agora só falta mais alguns temas para finalizarmos essa parte de linguagens e começarmos a ver a programação em sistemas embarcados propriamente dita.
Referências
DEITEL, H. M. DEITEL, P. J. C++: Como programar. Pearson Education do Brasil. 2006.
GBDONLINE. Learn C++ Programming. Disponível em: <https://learn.onlinegdb.com/c%2B%2B_for_beginners> Acesso em 05 ago. 2024.
W3SCHOOLS. C++ Tutorial. Disponível em: <https://www.w3schools.com/cpp/default.asp> Acesso em 05 ago. 2024.