Polimorfismo frente a herencia: diferencia entre polimorfismo y herencia [2022]

Publicado: 2021-01-05

El polimorfismo y la herencia son conceptos muy fundamentales de la programación orientada a objetos. La adición de objetos en los lenguajes de programación modernos ha marcado una diferencia considerable en la forma en que usamos el lenguaje y las cosas que somos capaces de hacer con ellos. En pocas palabras, la programación orientada a objetos es un conjunto de métodos que permite al programador usar clases y, por lo tanto, derivar objetos basados ​​en estas clases.

Su objetivo es parecerse a las entidades del mundo real y facilitar que los programadores hagan que su código incluya el paradigma en el que están escribiendo su código. Básicamente, existen cuatro conceptos de programación orientada a objetos, a saber, herencia, abstracción, polimorfismo y encapsulación. Ahora, cada una de las ideas, como se mencionó anteriormente, puede considerarse como los pilares sobre los que se asienta cualquier lenguaje moderno.

Volviendo a nuestro tema de polimorfismo frente a herencia y derecho del murciélago, vemos una diferencia evidente entre los dos conceptos. La herencia es el concepto que permite reutilizar el código en el mismo programa o en uno diferente. Incluso podemos cambiar el comportamiento del código manteniendo las cosas que nos gustan y descartando las que no son útiles para las tareas que intentamos realizar. La herencia ahorra mucho tiempo en el desarrollo de casi todo lo que vemos en nuestras pantallas digitales hoy en día.

Por otro lado, el polimorfismo es responsable de dictar el código que ya se escribió y decidir qué tipo de código debe ejecutarse en función de parámetros específicos en tiempo real. Sería beneficioso para cualquiera pasar primero por cada uno de estos conceptos en detalle, antes de pasar a la discusión de la diferencia entre polimorfismo y herencia. Las diferencias se harán más pronunciadas una vez que sepamos qué se entiende exactamente por herencia y polimorfismo.

Obtenga títulos de ingeniería de software de las mejores universidades del mundo. Obtenga programas Executive PG, programas de certificados avanzados o programas de maestría para acelerar su carrera.

Tabla de contenido

Herencia

Sería un crimen en el paradigma de la programación no considerar la Herencia como un concepto OOP muy crucial. La importancia de la herencia nunca debe tratarse a la ligera porque el objetivo de la herencia es la "reutilización". Lo que hace la herencia, como su nombre lo indica, es que permite que el código escrito en una clase se extienda a otra clase. Entonces, en la herencia, existe una clase base; la clase en la que está escrito el código se va a reutilizar.

La próxima clase que crearíamos tendría que ser heredada de esta clase base para usar todas las funciones y variables asociadas con la clase base. Cada vez que una clase toma las propiedades de otra clase (o hereda de una clase diferente), todos los miembros que están presentes en la clase base se convierten en miembros de esta nueva clase derivada.

El código de muestra que se proporciona a continuación le mostrará cómo se ve una forma general de herencia. Una cosa clave a tener en cuenta aquí es que la sintaxis exacta que tendría que escribir para habilitar la herencia de su código dependería únicamente del lenguaje de programación que elija.

  1. class nombre-clase-derivada : especificador-acceso nombre-clase-base{
  2. // cuerpo de la clase derivada
  3. }

En el ejemplo que se muestra arriba, ciertas cosas necesitan una pequeña explicación. La palabra "especificador de acceso" se refiere a la forma en que la clase derivada accedería a las propiedades y métodos de la clase base. Hay tres especificadores de acceso en general, cada uno con su propio significado (a saber, privado, público y protegido) y propiedades.

Una vez más, dependiendo del idioma que elija, es posible que deba o no utilizar estos especificadores de acceso. Entonces, en el mundo de C++, si heredas sin especificar nada por defecto, se vuelve privado. Sin embargo, si hereda de una estructura (va por la palabra clave struct), el especificador de acceso predeterminado sería público en lugar de privado.

Leer: Oportunidades de carrera en lenguaje de programación R

C ++ también le brinda muchas opciones para elegir cuando está haciendo herencia. Encontrará algunos de ellos enumerados a continuación:

un. Herencia jerárquica: este tipo de herencia sigue la regla de que solo debe haber una superclase, y de esa superclase deben haber muchas subclases derivadas. Encontrarás un ejemplo de ello a continuación:

  1. // Clase base
  2. clase A
  3. {
  4. vacío público funA()
  5. {
  6. //
  7. }
  8. }
  9. //Clase derivada
  10. clase B: A
  11. {
  12. público vacío funB ()
  13. {
  14. //
  15. }
  16. }
  17. //Clase derivada
  18. clase C: A
  19. {
  20. public void funC()
  21. {
  22. //
  23. }
  24. }
  25. //Clase derivada
  26. clase D: C
  27. {
  28. fondo vacío público ()
  29. {
  30. //
  31. }
  32. }
  33. //Clase derivada
  34. clase E: C
  35. {
  36. diversión de vacío público ()
  37. {
  38. //
  39. }
  40. }
  41. //Clase derivada
  42. clase F: B
  43. {
  44. diversión de vacío público ()
  45. {
  46. //
  47. }
  48. }
  49. //Clase derivada
  50. clase G: B
  51. {
  52. función de vacío público ()
  53. {
  54. //
  55. }
  56. }

B. Herencia múltiple: si está haciendo herencia múltiple, eso significaría que solo tiene una subclase derivada que hereda de varias superclases. A continuación encontrará un ejemplo sencillo de herencia múltiple:

  1. // Clase base
  2. clase A
  3. {
  4. vacío público funA()
  5. {
  6. //
  7. }
  8. }
  9. // Clase base
  10. clase B
  11. {
  12. público vacío funB ()
  13. {
  14. //
  15. }
  16. }
  17. //Clase derivada
  18. clase C: A, B
  19. {
  20. public void funC()
  21. {
  22. //
  23. }
  24. }

C. Herencia única: esta es quizás la forma más simple de herencia. Solo hay una clase base y una clase derivada. Encontrará un ejemplo a continuación:

  1. // Clase base
  2. clase A
  3. {
  4. vacío público funA()
  5. {
  6. //QUE HACER:
  7. }
  8. }
  9. //Clase derivada
  10. clase B: A
  11. {
  12. público vacío funB ()
  13. {
  14. //QUE HACER:
  15. }
  16. }

Polimorfismo

La definición básica de la palabra polimorfismo significa tener muchas formas. Esta definición es muy precisa para explicar el polimorfismo en el contexto de la programación. En este paradigma, el polimorfismo toma el significado de una función pero de muchas formas. El polimorfismo en realidad ocurre en tiempo de compilación. El polimorfismo en tiempo de compilación solo es posible debido al concepto de sobrecarga y, en tiempo de ejecución, la función de invalidación hace que el polimorfismo sea una realidad. Uno por uno, abordemos la definición de sobrecarga y anulación.

La sobrecarga requiere que el código que escribe o la función de la clase se escriba más de una vez con diferentes parámetros pero con el mismo tipo de retorno. Significa que los argumentos que pasa a la función pueden ser diferentes, y con solo mirar los valores finales que se pasan a la función en tiempo de ejecución, se decide qué forma de la función se llamará. En general, vemos que el constructor de clases es la función más sobrecargada. Toda esta teoría se volverá mucho más clara y será más fácil para ti arraigarla en tu mente con la ayuda de un ejemplo.

  1. sobrecarga de clase{
  2. int a, b;
  3. público:
  4. int sobrecarga (int x){ // primer constructor de sobrecarga()
  5. a=x;
  6. devolver un;
  7. }
  8. int sobrecarga (int x, int y){ // segundo constructor de sobrecarga ()
  9. a=x;
  10. b=y;
  11. devuelve a*b;
  12. }
  13. };
  14. int principal (){
  15. sobrecarga O1;
  16. O1. sobrecarga (20); //primera llamada al constructor de sobrecarga()
  17. O1. sobrecarga (20,40); // segunda llamada al constructor de sobrecarga()

Aquí, en este ejemplo, vemos la sobrecarga en acción. Observe cómo se llaman los diferentes constructores dependiendo de si el valor final del paréntesis del objeto es un número entero o dos.

Abordemos la definición de anulación a continuación. Solo puede anular aquellas funciones específicas que se heredan. Sí, la herencia es un punto clave para hacer posible la anulación de funciones. Si desea escribir una función y también anularla, en C++ tendrá que usar la palabra clave virtual antes de la definición de la función, y en la clase derivada usando el mismo nombre para su función, simplemente elimine la palabra clave virtual. Para solidificar su comprensión, aquí hay un ejemplo:

  1. base de clase{
  2. público:
  3. virtual void funct (){ // función virtual de la clase base
  4. cout<<“Esta es la funcion de una clase base(()”);
  5. }
  6. };
  7. clase derivada1: base pública{
  8. público:
  9. void funct (){ //función virtual de la clase base redefinida en la clase derivada1
  10. cout<<“Esta es una función de clase derivada1()”;
  11. }
  12. };
  13. int principal ()
  14. {
  15. base *p, b;
  16. derivado1 d1;
  17. *p=&b;
  18. p-> función (); //llamar a la clase base funct().
  19. *p=&d1;
  20. devolver 0;
  21. }

Mire cómo se usa la palabra clave virtual en la clase base, y en la clase derivada, la misma definición de función está allí, solo que la palabra clave virtual está ausente.

Algunas diferencias destacadas entre polimorfismo y herencia:

  1. La herencia consiste esencialmente en crear una clase y luego hacer que otras clases en su programa obtengan sus características de la clase base ya existente. Sin embargo, el polimorfismo es una interfaz y, por ser una interfaz, puede tomar diferentes formas y formas.
  2. La herencia es una propiedad que pertenece solo a las clases, mientras que el polimorfismo se extiende a cualquier método y/o función.
  3. La herencia permite que la clase derivada use todas las funciones y variables declaradas en la clase base sin volver a definirlas explícitamente. Por eso decimos que la herencia aumenta la reutilización del código y reduce la longitud del código, que tendríamos que escribir si la herencia estuviera ausente. Mientras que el polimorfismo permite que el mismo nombre de función tenga dos códigos muy diferentes. Entonces, en cierto sentido, en lugar de reducir la longitud del código que tendríamos que escribir, el polimorfismo lo extiende aún más.
  4. Hay muchas formas que puede tomar la herencia; puedes ser muy creativo con la herencia. Sin embargo, el polimorfismo sólo puede lograrse por dos medios, es decir, sobrecarga y anulación. Todavía puede volverse muy loco al usar polimorfismo, pero está restringido a solo las dos formas de implementarlo en su código de escritura.

Debe leer: Debe leer 47 preguntas y respuestas de la entrevista OOPS para principiantes y experimentados

Polimorfismo frente a herencia: diferenciación tabular

En la siguiente tabla, encontrarás una clara diferencia entre polimorfismo y herencia:

MEDIDAS COMPARATIVAS HERENCIA POLIMORFISMO
Diferencias fundamentales entre los dos El significado de la herencia es crear nuevas clases que tienen propiedades (funciones y variables de las clases existentes) Es esencialmente una plataforma que permite escribir el código en diferentes formas.
Las diferencias en la forma en que ambos podrían integrarse en su código Solo las clases pueden disfrutar de herencia real en el código. Puede ser implementado y utilizado por cualquier función y/o método a lo largo de todo el código.
Las diferencias en la forma en que ambos podrían ser utilizados. Permite reutilizar el código escrito en el mismo programa o en uno diferente. Sin él, a la programación orientada a objetos le faltaría una característica crucial. Permite que el objeto declarado tome la decisión de qué forma de la función se llamará. Hay dos momentos en los que esto se puede decidir. En tiempo de ejecución, se denomina anulación; en tiempo de compilación, se llama sobrecarga.
Diferentes formas que ambos pueden tomar. Hay una plétora de formas que puede tomar la herencia. Sólo puede haber dos formas de polimorfismo. Dependiendo del tiempo en el programa, cambia de sobrecarga a anulación.
Un ejemplo básico que demuestra cómo se implementa cada uno de ellos. La clase moto puede heredar de la clase de vehículos de dos ruedas, que a su vez podría ser una subclase de vehículos. La bicicleta de clase puede tener un método llamado set_color(), que cambia el color de la bicicleta según el nombre del color que hayas ingresado.

Consulte: ¿Qué es Type Casting en Java? Comprender la fundición de tipos como principiante

Conclusión

Es seguro decir que tanto el polimorfismo como la herencia son conceptos críticos para hacer realidad cualquier programa. Ambos son la base sobre la que se asentó la idea de la programación orientada a objetos. Hay muchas diferencias entre el polimorfismo y la herencia porque tienen dos propósitos muy diferentes.

El polimorfismo permite al programador escribir múltiples definiciones de una función. Al mismo tiempo, la herencia permite al usuario reutilizar el código ya escrito. Para comprender y apreciar completamente los dos conceptos, se recomienda que siga leyendo sobre ambos temas.

Una cosa que siempre debe tener en cuenta cuando esté escribiendo código es que si está buscando refactorizar el código que ya ha escrito (básicamente, la definición de una clase y usarla nuevamente en su código para servir a un código similar o diferente). propósito), debe hacer uso de la herencia. Si busca reducir la confusión general en su código y quiere usar el mismo nombre de la función para realizar tareas similares, debe usar polimorfismo.

Si está interesado en obtener más información sobre el desarrollo de software de pila completa, consulte el Diploma PG de upGrad & IIIT-B en desarrollo de software de pila completa, que está diseñado para profesionales que trabajan y ofrece más de 500 horas de capacitación rigurosa, más de 9 proyectos y asignaciones, estado de ex alumnos de IIIT-B, proyectos finales prácticos y asistencia laboral con las mejores empresas.

Planifique su carrera de desarrollo de software ahora.

Solicite la certificación PG vinculada al trabajo de upGrad en ingeniería de software