La capacidad de una clase para derivar propiedades y características de otra clase se llama herencia. La herencia es una de las características más importantes de la Programación Orientada a objetos.
Subclase: la clase que hereda propiedades de otra clase se llama Subclase o clase derivada.
Super Class: la clase cuyas propiedades son heredadas por subclase se llama clase Base o superclase.
el artículo se divide en los siguientes subtemas:
- ¿Por qué y cuándo usar la herencia?,
- los Modos de Herencia
- Tipos de Herencia
¿por Qué y cuándo utilizar la herencia?
considere un grupo de vehículos. Es necesario crear clases para autobús, coche y camión. Los métodos fuelAmount(), capacity(), applyBrakes() serán los mismos para las tres clases., Si creamos estas clases evitando la herencia, entonces tenemos que escribir todas estas funciones en cada una de las tres clases como se muestra en la siguiente figura:
Puede ver claramente que el proceso anterior resulta en la duplicación del mismo código 3 veces. Esto aumenta las posibilidades de error y redundancia de datos. Para evitar este tipo de situación, se utiliza la herencia., Si creamos un vehículo de clase y escribimos estas tres funciones en él y heredamos el resto de las clases de la clase de vehículo, entonces simplemente podemos evitar la duplicación de datos y aumentar la reutilización. Mire el siguiente diagrama en el que las tres clases se heredan de la clase del vehículo:
usando herencia, tenemos que escribir las funciones solo una vez en lugar de tres veces como hemos heredado el resto de las tres clases de la clase base(vehículo).,
implementar la herencia en C++: para crear una subclase que se hereda de la clase base tenemos que seguir la siguiente sintaxis.
Sintaxis:
class subclass_name : access_mode base_class_name{ //body of subclass};
Aquí, subclass_name es el nombre de la sub clase, access_mode es el modo en el que desea heredar esta sub clase por ejemplo: público, privado, etc. y base_class_name es el nombre de la clase base de la que desea heredar la subclase.nota: una clase derivada no hereda el acceso a los miembros de datos privados., Sin embargo, hereda un objeto padre completo, que contiene cualquier miembro privado que esa clase declare.
Output:
Child id is 7Parent id is 91
en el programa anterior, la clase ‘Child’ se hereda públicamente parent ‘class por lo que los miembros de datos públicos de la clase’ parent ‘también serán heredados por la clase’ child’.
modos de herencia
- Modo Público: si derivamos una subclase de una clase base pública., Entonces el miembro público de la clase base se volverá público en la clase derivada y los miembros protegidos de la clase base se volverán protegidos en la clase derivada.
- modo protegido: si derivamos una subclase de una clase base protegida. Entonces, tanto los miembros públicos como los miembros protegidos de la clase base se convertirán en protegidos en clase derivada.
- modo privado: si derivamos una subclase de una clase base privada. Entonces, tanto los miembros públicos como los miembros protegidos de la clase base se convertirán en Privados en clase derivada.,
Nota: Los miembros privados de la clase base no pueden ser accedidos directamente en la clase derivada, mientras que los miembros protegidos pueden ser accedidos directamente. Por ejemplo, Las Clases B, C y D contienen todas las variables x, Y Y z en el ejemplo siguiente. Es sólo cuestión de acceso.,
la siguiente tabla resume los tres modos anteriores y muestra el especificador de acceso de los miembros de la clase base en la subclase cuando se deriva en los modos público, protegido y privado:
tipos de herencia en c++
un caso especial de herencia híbrida:>una clase derivada con dos clases base y estas dos clases base tienen una clase base común se llama herencia multipath. Una ambigüedad puede arrise en este tipo de herencia.,
Considere el siguiente programa:
Salida:
A from ClassB : 10A from ClassC : 100B : 20C : 30D : 40
En el ejemplo anterior, tanto ClassB & ClassC heredar ClassA, ambos tienen una sola copia de ClassA. Sin embargo ClassD hereda tanto ClassB & ClassC, por lo tanto ClassD tiene dos copias de ClassA, una de ClassB y otra de ClassC.,
si necesitamos acceder al miembro de datos a de ClassA a través del objeto de ClassD, debemos especificar la ruta desde la que se accederá a a, ya sea desde ClassB o ClassC, el compilador bco’Z no puede diferenciar entre dos copias de ClassA en ClassD.
hay 2 maneras de evitar esta ambigüedad:
- Use scope resolution operator
- Use virtual base class
evitar la ambigüedad usando scope resolution operator:
usando scope resolution operator podemos especificar manualmente la ruta desde la que se accederá al miembro de datos a, como se muestra en la instrucción 3 y 4, en el ejemplo anterior.,
obj.ClassB::a = 10;
obj.ClassC::a = 100;
Nota : Aún así, hay dos copias de ClassA en ClassD.,
evitar ambigüedades usando la clase base virtual:
salida:
A : 100B : 20C : 30D : 40
de acuerdo con el ejemplo anterior, classd tiene solo una copia de classa, por lo tanto, la instrucción 4 sobrescribirá el valor de a, dado en la instrucción 3.
Este artículo es contribuido por Harsh Agarwal. Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando contribute.geeksforgeeks.org o envíe su artículo a [email protected]., Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Attention reader! No dejes de aprender ahora. Obtenga todos los conceptos importantes de C++ Foundation y STL con los cursos C++ Foundation y STL a un precio amigable para los estudiantes y prepárese para la industria.