Problema de diamantes C ++

Problema de diamantes C ++
Un problema de diamantes es un problema que ocurre en los lenguajes de programación, especialmente en C ++, cuando está utilizando múltiples herencias. Múltiples herencias en C ++ se usan comúnmente como herramienta cuando el código es muy largo. Entonces, para manejar el código fuente, usamos clases para administrar el programa. Sin embargo, las herencias múltiples causan un problema si no se usa correctamente. Estos problemas contienen principalmente el problema de diamantes. Este tutorial tiene como objetivo resaltar los factores principales del problema del diamante, cómo ocurre a partir de las herencias múltiples y todas las soluciones requeridas para resolverlo.

Para ejecutar los programas con respecto a la "herencia de diamante C ++" en el sistema operativo Linux, debe tener un sistema Ubuntu instalado y ejecutado en la máquina virtual. Se utilizan dos herramientas. Una es cualquier herramienta de edición y, como tal, utilizaremos el "Editor de texto" predeterminado de Linux. Puede usar otras herramientas de edición preferidas. El segundo es el terminal de Ubuntu. En el cual ejecutará el programa y puede ver la salida que se muestra.

Primero, discutiremos múltiples herencias en el artículo, ya que el "problema de diamantes" ocurre en el caso de tener herencia en el código fuente.

Múltiples herencias en C++

Cuando hablamos sobre el uso de clases jerárquicamente en el programa, siempre sabemos OOP (programación orientada a objetos). Porque esta herencia es una característica importante de los objetos orientados a los objetos, donde una subclase es capaz de heredar de una o más superclases. De esta manera, una clase infantil tiene dos o más padres.

Por ejemplo, si una madre y un padre tienen un hijo en un escenario de la vida real, el niño heredará todo de los padres. Entonces se sabe que este niño es una clase derivada con madre y padre como padres. Volvamos hacia las herencias múltiples. Usaremos "constructores" como parte de nuestra discusión actual. Los constructores de una clase hereditaria (clase infantil) en múltiples herencias se ejecutan siguiendo su orden heredado. Mientras que para los destructores, el orden es el reverso de la herencia. Ahora, citaremos un ejemplo simple para demostrar la funcionalidad de la herencia en C++.

Ejemplo de herencias múltiples

Considere un ejemplo en el que hay dos clases, Clase A y Clase B, como clase de padre, y estas dos clases tienen una clase infantil llamada Clase C. Esta clase es una clase derivada de sus dos padres. Usaremos un constructor en la parte pública de cada clase.

El primer paso en el código es usar una biblioteca para permitir la transmisión de entrada-salida:

Luego tenemos que declarar la clase A, tener los constructores con el nombre de la clase. Como sabe que los constructores se declaran con el nombre de esa clase, y estos se llaman cada vez que se crea el objeto. En el constructor, se ha mostrado un mensaje simple que muestra qué constructor de clases se ejecuta. Ahora, definimos la clase B con el mismo enfoque. Después de ambas clases de padres, se menciona a la clase infantil.

Una cosa que debe tenerse en cuenta aquí es el orden de las clases de los padres que el niño hereda porque esta orden será importante en el momento de la ejecución del constructor y un mensaje que se muestra.

Ahora, en la clase principal, crearemos un objeto de la clase infantil. Como tiene múltiples herencias, no es necesario crear el objeto para la clase principal. Se ejecutan automáticamente debido al objeto de clase infantil:

Int main ()
C C;
Regresar 0;

Después de escribir el código anterior en el editor de texto, guarde este archivo con la extensión de '.C'. Ejecutaremos el archivo en el terminal Ubuntu. Para el propósito de ejecución, se requiere un compilador. En C ++, usamos un compilador G ++. De lo contrario, primero necesita instalarlo:

$ G ++ -O M1 M1.C
ps ./M1

Use G ++ con el nombre del archivo que tiene el código fuente y el que desea mostrar la salida. Nota, -O se usa para guardar la salida. Como la clase B se hereda por encima de la Clase A, por lo que su constructor se ejecuta primero, puede ver la salida de la imagen anterior.

Como el concepto de herencia es claro ahora, discutiremos el "problema de diamantes" aquí.

Problema de diamantes

Un problema de diamantes es un caso solo en herencias múltiples que ocurre cuando una clase infantil tiene los valores heredados de los dos padres. En el que estas clases de padres se heredan de una clase de abuelos común.

Por ejemplo, considere un ejemplo en el que tenemos una clase infantil heredada de las clases de madre y padre. Estas clases heredan una tercera clase llamada "Persona":

Niño> Madre> Persona
> Padre> Persona

Entonces, de acuerdo con el escenario dado, la clase de niños hereda la clase de "persona" dos veces en el programa. Una vez, es de la madre, y nuevamente, la segunda vez es del padre. Esto crea confusión para que el compilador ejecute qué constructor primero. Esta situación causa un gráfico de herencia en forma de diamante. Por lo tanto, se conoce como "el problema del diamante".

El enfoque del código es casi el mismo. Declarar la clase base y luego dos clases de hijo heredado (madre, padre) de la clase base. El constructor sigue a cada clase con una variable para almacenar un valor en él:

Ahora, presentando la clase de niños:

# Clase Niño: Padre Público, Madre Pública

La clase infantil heredará ambas clases de padres. La función principal utilizará el objeto del niño y un valor en el parámetro de la llamada del constructor:

Después de guardar el código, es hora de usar el compilador para la ejecución y ver el resultado:

Ahora, puedes observar que la clase base se llama dos veces. Este es un problema de diamantes. Después de describir el problema, ahora encontraremos una posible solución.

Solución del problema de diamantes

La solución depende del uso de la palabra clave "virtual". Las clases de dos padres con una clase base común ahora heredarán la clase base virtualmente para minimizar la ocurrencia de copias de la clase base en la clase infantil. Ahora, modificaremos el código usando esa palabra clave:

Cada vez que la clase principal hereda de la clase de abuelos, se usa "virtual" pero solo con los padres, no en el caso de un niño. Esta es "la herencia virtual". Limita el paso de más de una sola instancia de la clase base para pasar.

# Clase Padre: persona pública virtual

Ahora, ejecutaremos el código. Los valores resultantes muestran que la ambigüedad se elimina utilizando este concepto:

Para evitar la repetición del constructor base a llamar, el constructor para una clase base virtual no se alcanza a través de la clase que lo ha heredado. Sin embargo, este constructor se llama desde el constructor de clase de concreto. En el ejemplo actual, la clase infantil llama directamente al constructor de clase "persona".

Conclusión

"Problema de diamantes C ++" es un artículo escrito para eliminar la ambigüedad de la repetición de la clase base en múltiples herencias. El concepto de herencia se explica brevemente con ejemplos. Del mismo modo, la causa y la solución para el problema del diamante también se elaboran en detalle. Esperamos que este tutorial pueda brindarle orientación en el campo de los programas de C ++.