Saltar al contenido

Problema del diamante

Solución:

No es el mismo problema.

En el problema original, el método anulado se puede llamar desde A. En su problema, este no puede ser el caso porque no existe.

En el problema del diamante, el choque ocurre si la clase A llama al método Foo. Normalmente esto no supone ningún problema. Pero en la clase D nunca se puede saber qué instancia de Foo debe llamarse:

         +--------+
         |   A    |
         | Foo    |
         | Bar    |
         +--------+
            /  
           /    
          /      
+--------+        +--------+
|   B    |        |   C    |
| Foo    |        | Foo    |
+--------+        +--------+
                /
               /
              /
         +--------+
         |   D    |
         |        |
         +--------+

En su problema, no hay un ancestro común que pueda llamar al método. En la clase D hay dos sabores de Foo entre los que puede elegir, pero al menos sabe que hay dos. Y puede elegir entre los dos.

+--------+        +--------+
|   B    |        |   C    |
| Foo    |        | Foo    |
+--------+        +--------+
                /
               /
              /
         +--------+
         |   D    |
         |        |
         +--------+

Pero, como siempre, no necesita herencia múltiple. Puede utilizar agrandamiento e interfaces para resolver todos estos problemas.

En el problema del diamante, la clase D hereda implícitamente el método virtual de la clase A. Para llamarlo, la clase D llamaría:

A::foo()

Si ambas clases B y C anulan este método, entonces surge el problema de cuál se llama realmente.

Sin embargo, en su segundo ejemplo, este no es el caso, ya que la clase D necesitaría indicar explícitamente cuál se estaba llamando:

B::foo()
C::foo()

Entonces los problemas no son los mismos. En el problema del diamante, no hace referencia a las clases derivadas, sino a su clase base, de ahí la ambigüedad.

De todos modos, así es como lo entiendo.

Tenga en cuenta que vengo de una experiencia en C ++.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *