Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Você pode dar um exemplo de polimorfismo?

0 votos
362 visitas
perguntada Mar 24, 2016 em Programação Computacional por danielcajueiro (5,806 pontos)  
editado Abr 7, 2016 por danielcajueiro
Compartilhe

2 Respostas

+2 votos
respondida Abr 8, 2016 por Saulo (456 pontos)  

Segue a tradução do código para C++. O exemplo abaixo utiliza também o conceito de herança (classe Shape), que não está presente no exemplo de Python. O container utilizado foi o "vector". O loop que mostra as áreas de cada forma geométrica foi feito de duas formas para fins didáticos.

#include <iostream>
#include <string>
#include <vector>
#include <math.h>

using namespace std;

class Shape {
    public:
        virtual ~Shape(){};
        virtual double calculateArea() = 0;
};

class Square : public Shape {
    private:
    double side;
    public:
        Square(double s) : side(s) {}
        double calculateArea() {
            return pow(side, 2.0);
        }
};

class Circle : public Shape {
    private:
    double radius;
    public:
        Circle(double r) : radius(r) { }
        double calculateArea() {
            static double PI = atan(1.0)*4;
            return PI * pow(radius, 2.0);
        }
};

int main(int argc, char* argv[])
{
    vector<Shape*> myGeometricFigures;
    Square square2(2.0);
    myGeometricFigures.push_back(&square2);

    Circle circle2(2.0);
    myGeometricFigures.push_back(&circle2);

    Square square3(3.0);
    myGeometricFigures.push_back(&square3);

    // Forma 1 de fazer o loop: usando indices
    for (unsigned int i = 0; i < myGeometricFigures.size(); i++)
    {
        cout << myGeometricFigures[i]->calculateArea() << endl;
    }

    // Forma 2 de fazer o loop: usando iterator
    for (vector<Shape*>::const_iterator it = myGeometricFigures.begin(); it != myGeometricFigures.end(); it++)
    {
        cout << (*it)->calculateArea() << endl;
    }

    return 0;
}
+1 voto
respondida Mar 24, 2016 por danielcajueiro (5,806 pontos)  

Um exemplo interessante é o comportamento de uma lista em python que muda de comportamento dependendo do objeto guardado na lista:

class Square:
    def __init__(self, side):
        self.side = side
    def calculateArea(self):
        return self.side**2

class Circle:
    def __init__(self, radius):
        self.radius = radius
    def calculateArea(self):
        import math
        return math.pi*(self.radius**2)            

if __name__ == '__main__':

    myGeometricFigures=[Square(2),Circle(2),Square(3)]

    for figure in myGeometricFigures:
        print(figure.calculateArea())
...