Atenção agora, pois esse é um conceito que causa muita confusão em
POO. A razão da confusão é que muitos confundem polimorfismo com
construtores múltiplos (sobrecarregados).
Em algumas linguagens é possível "sobrecarregar" o construtor de uma
classe. O que significa isso?
Sobrecarregar um construtor significa que vamos fornecer diversos
construtores diferentes para uma mesma classe. Elas será construída de
acordo com a chamada específica feita.
Um caso comum é quando queremos prover a classe com um "construtor
default", ou seja, um construtor que cria um objeto básico daquela
classe. Para exemplificar, na nossa classe Sentável poderia ser algo
assim:
class Sentavel {
public:
Sentavel( int, int ); // O construtor já definido antes
Sentavel();
};
E na implementação acrescentaríamos:
Sentavel::Sentavel() {
this->set_assentos( 1 );
this->set_suportes( 4 );
}
E com isso teríamos criado um "objeto padrão" que poderia ser
posteriormente modificado, dependendo da lógica da nossa aplicação.
Tudo isso é muito lindo e dá uma flexibilidade ainda maior para a POO,
mas eu tenho uma novidade: ISSO NÃO É POLIMORFISMO!
Ao contrário do que muitos pensam, polimorfismo não é poder criar uma
classe de formas diversas com construtores sobrecarregados.
Polimorfismo é a capacidade implícita de um objeto de se comportar
como seus ancestrais.
Para entender melhor, consideremos um dos objetos que instanciamos a
partir da classe Sentável na seção 8.
Suponha que tivéssemos optado por construir uma classe Tamborete, por
exemplo:
class Tamborete : Sentavel {
};
Qualquer referência a essa classe pode ser interpretada como uma
referência à classe anterior, de forma que podemos explorar em
Tamborete recursos que estão disponíveis em Sentável.
Isso é simples conseqüência do fato de que ao ser um Tamborete o
objeto não deixa de ser um Sentavel. Voltando para Aristóteles:
PREMISSA 1: Todo Tamborete é um Sentável.
PREMISSA 2: X é um Tamborete.
CONCLUSÃO: X é um Sentável.
Silogismo válido!