inheritance c
Importancia de la herencia en C ++ con ejemplos:
La herencia es una de las características más importantes de la programación orientada a objetos.
La herencia es la técnica mediante la cual una clase adquiere las propiedades y métodos de otra clase. De esta forma podemos reutilizar el código que ya está escrito y verificado. La clase que adquiere las propiedades de otra clase se llama subclase o clase derivada o clase secundaria.
La clase cuyas propiedades se adquieren se llama clase base o clase padre o superclase. Cuando una clase adquiere o hereda otra clase, entonces todas las propiedades y métodos de la clase base están disponibles para la clase derivada, de modo que podamos reutilizar este código.
=> Visite aquí para aprender C ++ desde cero.
preguntas y respuestas de la entrevista de soporte técnico básico
Lo que vas a aprender:
- ¿Por qué necesitamos la herencia?
- Modos de herencia
- Orden de constructores / destructores en herencia
- Tipos de herencia
- Herencia de plantilla
- Composición
- ¿Cómo debemos decidir entre composición y herencia?
- Conclusión
- Lectura recomendada
¿Por qué necesitamos la herencia?
Considere un grupo de vehículos como automóvil, autobús, jeep, etc. Cada uno de estos vehículos tendrá propiedades y métodos como se indica en el diagrama a continuación.
Si se nos requiere implementar clases individuales para los vehículos anteriores, podemos ver que en las tres clases, tendremos que escribir el mismo código ya que los tres tipos de vehículos exhiben más o menos las mismas propiedades. Esto hará que nuestro programa sea ineficaz y engorroso, ya que habrá mucho código duplicado.
En lugar de escribir un código duplicado como el anterior, podemos implementar la función de herencia para evitar que el código se duplique y también escribir una sola pieza de código y usarla en las tres clases. Esto se representa gráficamente como se muestra a continuación.
En la figura anterior, hemos definido una clase base 'Vehículos' y derivado las clases Coche, Autobús y Jeep de esta clase. Los métodos y propiedades comunes ahora forman parte de la clase Vehículos. Como otras clases se derivan de la clase Vehículos, todas las clases adquieren estos métodos y propiedades.
Por lo tanto, solo necesitamos escribir el código común solo una vez y las tres clases; Car, Bus y Jeep lo adquirirán.
Por lo tanto, la principal ventaja que obtenemos al heredar las clases existentes o diseñar el mecanismo de herencia es la reutilización del código.
Lectura adicional = >> Tutorial de herencia de Java
El formato general para heredar una clase es:
|_+_|Aquí ' derivado_classname 'Es el nombre de la clase derivada', access_specifier 'Es el modo de acceso, es decir, público, protegido o privado en el que la clase derivada tiene que heredar la clase base y' derivado_classname ”Es el nombre de la clase base de la que hereda la clase derivada.
Modos de herencia
El 'access_specifier' que se muestra en la declaración de herencia anterior, puede tener sus valores como se muestra a continuación.
Dependiendo del access_specifier especificado cuando heredamos la clase, tenemos varios modos de herencia que se enumeran a continuación.
Herencia pública
Sintaxis general
|_+_|Cuando se especifica un especificador de acceso público, los miembros públicos de la clase base se heredan como públicos mientras que los miembros protegidos están protegidos. Los miembros privados permanecen privados. Este es el modo de herencia más popular.
Herencia privada
Sintaxis general
|_+_|La herencia privada no hereda nada. Cuando se usa un especificador de acceso privado, los miembros públicos y protegidos de la clase base también se vuelven privados.
Herencia protegida
Sintaxis general
|_+_|Cuando se usa un especificador de acceso protegido, los miembros públicos y protegidos de la clase base se convierten en miembros protegidos en la clase derivada.
Tenga en cuenta que cuando usamos un especificador de acceso privado para la clase base, ninguno de los miembros de la clase base se hereda. Todos se vuelven privados en la clase derivada.
A continuación se muestra la representación tabularizada de todos los modos de acceso y su interpretación para la herencia.
Clase derivada -> Clase base | Privado | Público | Protegido |
---|---|---|---|
Privado | No heredado | No heredado | No heredado |
Público | Privado | Público | Protegido |
Protegido | Privado | Protegido | Protegido |
Orden de constructores / destructores en herencia
Cuando se heredan las clases, los constructores se llaman en el mismo orden en que se heredan las clases. Si tenemos una clase base y una clase derivada que hereda esta clase base, entonces se llamará primero al constructor de la clase base (ya sea por defecto o parametrizado) seguido por el constructor de la clase derivada.
El siguiente programa demuestra el orden de los constructores en herencia. Tenemos una clase Base 'Base' que tiene un constructor predeterminado y un constructor parametrizado. Derivamos una clase de esto llamada 'Derived' que también tiene un constructor predeterminado y otro parametrizado.
La salida de este programa muestra el orden en que se llaman los constructores.
|_+_|Producción:
Constructor predeterminado de clase base
Constructor predeterminado de clase base
Constructor predeterminado de la clase derivada
Constructor parametrizado de clase base
Constructor parametrizado de clase derivada
Vemos que después de crear el objeto de clase base creamos un objeto de clase derivada con un constructor predeterminado. Cuando se crea este objeto, primero se llama al constructor predeterminado de la clase base y luego se ejecuta el constructor de la clase derivada.
De manera similar, cuando el objeto de la clase derivada se crea utilizando el constructor parametrizado, primero se llama al constructor parametrizado de la clase base y luego al constructor de la clase derivada.
Tenga en cuenta que si no hubiera un constructor parametrizado en la clase base, entonces se habría llamado al constructor predeterminado incluso para construir el objeto de clase derivada parametrizado.
Pero la pregunta sigue siendo por qué se llama al constructor de la clase base mientras se construyen los objetos de la clase derivada.
Sabemos que se usa un constructor para crear objetos de la clase y también para inicializar los miembros de la clase. Cuando se crea el objeto de clase derivada, su constructor solo tiene control sobre los miembros de la clase derivada.
Sin embargo, la clase derivada también hereda los miembros de la clase base. Si solo se llama al constructor de la clase derivada, los miembros de la clase base heredados por la clase derivada no se inicializarían correctamente.
Como resultado, el objeto completo no se creará de manera eficiente. Esta es la razón por la cual todos los constructores de clases base se llaman primero cuando se crea un objeto de clase derivada.
Tipos de herencia
Dependiendo de la forma en que se derive la clase o de cuántas clases base hereda una clase, tenemos los siguientes tipos de herencia como se muestra en la figura siguiente.
Exploraremos cada uno de estos tipos en nuestro próximo tutorial sobre 'Tipos de herencia'.
Herencia de plantilla
Cuando nuestra implementación involucra plantillas, entonces necesitamos heredar o derivar de clases de plantilla, y usamos la herencia de plantilla allí.
fusionar ordenar algoritmo c ++
Pasemos directamente a un ejemplo de programación para comprender mejor la herencia utilizando plantillas.
|_+_|Producción:
basecls_Template obj = 100
derivadocls_Child obj1 (heredado de basecls_Template = A
En el programa anterior, tenemos una plantilla llamada basecls_Template que define la plantilla de clase para la clase base. A continuación, definimos una clase derivadacls_Child que queremos derivar de una clase de plantilla.
Pero tenga en cuenta que la clase basecls_Template es solo un tipo y no una clase. Por lo tanto, no podemos derivar la clase derivadacls_Child de esta plantilla.
Por tanto, si declaramos la clase hija como:
|_+_|Esto resultará en un error. La razón por la que basecls_Template es un tipo de datos y no una clase. Por lo tanto, para heredar los miembros de basecls_Template, primero debemos instanciarlo antes de derivarlo.
Por lo tanto, la declaración anterior, Clase derivadacls_Child: public basecls_Template funciona bien.
En esta declaración, hemos instanciado la plantilla basecls_Template a una plantilla de clase de carácter. Una vez que usamos esta clase de plantilla instanciada, las otras cosas que siguen, como crear y usar objetos, coinciden con el funcionamiento habitual de la herencia.
Composición
Hasta ahora hemos visto todo sobre las relaciones de herencia. La herencia básicamente describe el tipo de relaciones en las que la relación indica una parte. Por ejemplo, una serpiente es una especie de reptil. También podemos decir que Reptile es parte de la clase Animal.
En conclusión, la herencia indica 'ES UN' tipo de relaciones en las que podemos decir que la clase derivada es parte de la clase base.
También podemos representar las relaciones como un todo. Por ejemplo, si decimos que la clase Salario es parte de la clase Empleado, entonces no la representamos correctamente. Sabemos que Empleados tiene salario. Por tanto, es más conveniente decir 'El empleado tiene un salario'.
Del mismo modo, si tomamos la clase de vehículos como ejemplo, podemos decir que el vehículo tiene motor o el vehículo tiene chasis. Así, todas estas relaciones representan 'TIENE UN' relaciones que representan un objeto completo contenido en otra clase. Esto se define como Composición .
Las relaciones representadas por composición dependen unas de otras. Por ejemplo, un chasis no puede existir sin un vehículo. Del mismo modo, el salario no puede existir sin un empleado.
Podemos representar la composición en forma de diagrama como se muestra a continuación:
La composición también se denomina contención. En la representación anterior, hemos mostrado una clase padre. A diferencia de la herencia, incluimos un objeto de clase secundaria dentro de la clase principal. Esta es contención o composición.
cómo agregar valores a una matriz de Java
Tomemos un ejemplo de programación para entender esto.
|_+_|Producción:
10001 Ved
A-101 Silver Springs Aundh Pune Maharashtra
En este ejemplo, tenemos una clase padre Empleado y una clase secundaria Dirección. Dentro de la clase padre Empleado, hemos declarado un puntero a la clase Dirección y también inicializamos este objeto en el constructor Empleado. Por lo tanto, representamos la relación que el empleado tiene una dirección que es composición.
¿Cómo debemos decidir entre composición y herencia?
Tanto la composición como la herencia representan las relaciones entre clases. Mientras que la herencia representa la relación 'IS-A', la composición representa la relación 'HAS-A'.
Ahora la pregunta es ¿cuándo debemos usar la herencia y cuándo debemos usar la composición? En realidad, no podemos decidir sobre las situaciones exactas cuando deberíamos usar cualquiera de ellos. Esto se debe a que cada uno tiene sus propias ventajas y desventajas.
Ambos promueven la reutilización del código. La herencia puede hacer que el código sea voluminoso a medida que las soluciones se vuelven complejas, pero al mismo tiempo, también nos permite extender el código existente. Por lo tanto, debemos usar la herencia cuando nuestro requisito es modificar y usar las propiedades y el método de otra clase dentro de la nueva clase.
En otras palabras, cuando queremos agregar más propiedades y extender la clase existente. Por otro lado, cuando no queremos modificar las propiedades y el comportamiento de otra clase, sino simplemente usarla dentro de la clase, optamos por la composición.
Por lo tanto, la mejor decisión es si utilizar la composición o la herencia, sopesando los pros y los contras de ambas técnicas para la situación particular.
=>> Leer también Composición en Java
Conclusión
Por tanto, hemos llegado al final de nuestro tema sobre la herencia. Hemos visto varios modos de herencia. También hemos visto los tipos de herencia, que exploraremos en nuestro próximo tutorial. Aprendimos sobre el orden de los constructores que se ejecutan en caso de herencia.
También estudiamos sobre plantillas y herencia. Necesitamos crear una instancia de una plantilla antes de poder usarla en herencia, ya que la plantilla en sí es un tipo de datos y no podemos heredar de un tipo de datos.
La composición es otro tipo de relación de clase y primero necesitamos conocer la situación exacta y luego solo nosotros podemos decidir si usar la composición o la herencia.
En nuestro próximo tutorial, veremos más sobre los tipos de herencia.
=> Tenga cuidado con la serie de capacitación simple de C ++ aquí.
Lectura recomendada
- Tipos de herencia en C ++
- Polimorfismo en tiempo de ejecución en C ++
- Funciones de amigo en C ++
- Uso de la clase selecta de selenio para manejar elementos desplegables en una página web - Tutorial de selenio n. ° 13
- Clases y objetos en C ++
- Estático en C ++
- Tutorial de Unix Pipes: Pipes en la programación Unix
- Tutorial de interfaz Java y clase abstracta con ejemplos