I. Hola Compañero, por mi parte no conozco este ámbito, aunque me atrae la programación.
Quizás esta información sea útil hasta que responda un experto.
http://ofeliaprogra.blogspot.com.es/2010/10/herencia-y-polimorfismo-modularidad-y.html
https://translate.google.es/translate?hl=es&sl=en&u=https://dzone.com/articles/polymorphism-and-inheritance&prev=search
http://todoenjava.blogspot.com/2012/01/polimorfismo.html
https://translate.googleusercontent.com/translate_c?depth=1&hl=es&prev=search&rurl=translate.google.es&sl=en&sp=nmt4&u=https://stackoverflow.com/questions/11732422/is-polymorphism-possible-without-inheritance&usg=ALkJrhi6swLkjZPseBn6Pd5P_mWsvVJclA
http://es.kioskea.net/contents/413-oop-polimorfismo
http://www.forosdelweb.com/f45/polimorfismo-puede-existir-sin-herencia-pregunto-1099049/
http://materias.fi.uba.ar/7507/content/20102/teoricas/7507_04_polimorfismo.pdf
**En el principio, solo existian las estructuras. Luego vino el encapsulamiento (C-with-classes), metiendo funciones dentro de las estructuras (ocultando un parámetro con el puntero a los datos, conocido como 'this'), luego vino la herencia, y luego vinieron los polimorfismos (primero los de cohersion, luego el de inclusión, y por ultimo el paramétrico).
A la luz del Genesis, aclaro:
* La herencia NO SABE de la existencia de polimorfismo (vino primero). Como todos saben, la relación "X hereda de Y" hace que un conjunto de atributos de Y se alojen en X. Estos atributos pueden incluir: la interfaz, comportamiento (reuso), datos.
* La relación "X es polimorfico respecto de Y", significa que allí donde hay un Y puede ser reemplazado con un X y sigue compilando. En otras palabras, X provee la misma interfaz que Y, o a un X lo puedo bombardear con mensajes para un Y y se lo banca, y yo no me entero de si es un X o un Y. Como ven, tampoco en este punto el polimorfismo sabe de la herencia.
* PERO, en C++, el polimorfismo por inclusion SE IMPLEMENTA con herencia. ¿Por qué? Porque entre todas las porquerías que se heredan, se hereda también la interfaz.
* Existen casos de herencia sin polimorfismo, y polimorfismo sin herencia, tanto en C++ como en otros lenguajes:
- herencia privada deshabilita el polimorfismo (class Pepe : private Persona).
- Polimorfismo parametrico (un template parameter) no usa herencia. (Ver mas abajo)
- En algunos lenguajes (""VB"" x ej, si se puede considerar como tal), había un 'implements' que hacia que algo se comporte como otra cosa, pero no heredaba nada.
* Los tipos de polimorfismos que hay: (taxonomía según Cardelli)
- Por cohersion: overloading de operadores. float + int, char - long int, etc., presentan el mismo caso de uso, y el usuario no se entera. (No voy a aclarar más sobre este caso en este thread).
- Por inclusión: el que se hace por herencia, ya que INCLUYE los atributos, entre ellos la interfaz. class Pepe : public Persona.
- Parametrico: por templates (generic programming). Cada vez que hago template <class T>, efectúo sobre T operaciones sin saber el tipo de T. Por eso puedo pasarle diferentes tipos, siempre que se respeten los type requirements (por ejemplo: default-constructible, copy-constructible, assignable, addable, etc.).
* Type punning es agarrar un dato de determinado tipo y tratarlo como si fuera otro. En el caso de C++, la manera mas comun es utilizando el operador reinterpret_cast, sobre un area de memoria; en C, se hace con uniones. Por ejemplo:
float pepe;
int& pedro = *reinterpret_cast<int*>(&pepe);
O bien
Union U
{ float pepe;
int pedro;
};
Entonces todo lo que haga sobre pepe tendrá un efecto sobre pedro, y viceversa. Type punning NO REPRESENTA un caso de polimorfismo (no se puede decir que "pepe es polimorfico respecto de pedro", por un lado porque la relacion opera entre tipos de datos [y no sobre instancias], y por otro porque no proveen la misma interfaz).**