multiple oop inheritance diamond-problem

oop - multiple inheritance c++



Problema de diamante (2)

Wikipedia sobre el problema del diamante:

"... el problema del diamante es una ambigüedad que surge cuando dos clases B y C heredan de A, y la clase D hereda tanto de B como de C. Si un método en D llama a un método definido en A (y no anula el método ), y B y C han anulado ese método de manera diferente, entonces, ¿de qué clase hereda: B o C?

Entonces el diamante se ve así:

A / / B C / / D

Mi pregunta es, ¿qué pasa si no existe tal clase A, pero nuevamente B y C declaran el mismo método, digamos foo (). ¿No es este el mismo problema? ¿Por qué se llama entonces problema de diamantes?

Ejemplo:

class B { public void foo() {...} } class C { public void foo() {...} } class D extends B, C { } new D().foo();


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 que realmente se llama.

Sin embargo, en su segundo ejemplo, este no es el caso ya que la clase D necesitaría indicar explícitamente a qué se llamaba:

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

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

Así es como lo entiendo, de todos modos.

Tenga en cuenta que procedo de un fondo de C ++.


No es el mismo problema.

En el problema original, el método reemplazado puede llamarse 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 es problema. Pero en la clase D nunca se puede saber qué instancia de Foo necesita ser llamada:

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

En su problema, no existe un ancestro común que pueda invocar el método. En la clase D, hay dos sabores de Foo que puedes elegir, pero al menos sabes que hay dos. Y puedes elegir entre los dos.

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

Pero, como siempre, no necesitas herencia múltiple. Puede usar aggegration e interfaces para resolver todos estos problemas.