
A diferencia de muchos otros lenguajes de programación orientados a objetos, C ++ permite la herencia múltiple.
La herencia múltiple permite que una clase secundaria herede de más de una clase principal.
Al principio, parece una característica muy útil. Pero un usuario debe tener en cuenta algunas trampas al implementar esta función.
En los ejemplos siguientes, cubriremos algunos escenarios que uno debe tener en cuenta.
Comenzaremos con un ejemplo simple para explicar este concepto en C ++.
El resultado de este código es el siguiente:
I'm breathing as a snake.I’m crawling as a snake.
En el ejemplo anterior, tenemos una clase base llamada LivingThing . El animaly las clases de reptiles heredan de él. Solo el animalla clase anula el método breathe()
. La clase Snake hereda de las clases Animal y Reptile . Anula sus métodos. En el ejemplo anterior, no hay problema. Nuestro código funciona bien.
Ahora, agregaremos un poco de complejidad.
¿Qué pasa si la clase Reptile anula el breathe()
método?
La clase Snake no sabría a qué breathe()
método llamar. Este es el "problema del diamante".

Problema del diamante
Mira el código a continuación. Es como el código del ejemplo anterior, excepto que hemos anulado el breathe()
método en la clase Reptile .
Si intenta compilar el programa, no lo hará. Verás un mensaje de error como el siguiente.
member ‘breathe’ found in multiple base classes of different types
El error se debe al "problema del diamante" de la herencia múltiple. La clase Snake no sabe a qué breathe()
método llamar.
En el primer ejemplo, solo la clase Animal había anulado labreathe()
método. La clase Reptile no lo había hecho. Por lo tanto, no fue muy difícil para la clase Snake averiguar a qué breathe()
método llamar. Y la clase Snake terminó llamando al breathe()
método de la clase Animal .
En el segundo ejemplo, la clase Snake hereda dosbreathe()
métodos. El breathe()
método de la clase Animal and Reptile . Dado que no hemos anulado el breathe()
método en la clase Snake , hay ambigüedad.
C ++ tiene muchas características poderosas como la herencia múltiple. Pero no es necesario que utilicemos todas las funciones que ofrece.
No prefiero usar herencia múltiple y usar herencia virtual en su lugar.
La herencia virtual resuelve el clásico "Problema del diamante". Asegura que la clase secundaria obtenga solo una instancia de la clase base común.
En otras palabras, la clase Snake tendrá solo una instancia de la clase LivingThing . Las clases Animal y Reptile comparten esta instancia.
Esto resuelve el error de tiempo de compilación que recibimos anteriormente. Las clases derivadas de clases abstractas deben anular las funciones virtuales puras definidas en la clase base.
Espero que haya disfrutado de esta descripción general de la herencia múltiple y el "Problema del diamante".