2011-04-18 13 views
6

Estoy haciendo una API de GUI de juego donde cada widget hereda de la clase de Widget. Estaba pensando, cuando otros hacen sus propios widgets, pueden no estar completamente satisfechos con la clase base. Es posible que deseen agregar getTheme(), por ejemplo. ¿Sería una buena idea hacer todos mis widgets virtualmente heredados de Widget para que esto sea posible?¿Cuándo es una buena idea la herencia virtual?

Gracias

+0

¿Qué quiere decir con "herencia virtual"? –

+7

@unapersson: http://en.wikipedia.org/wiki/Virtual_inheritance – Mat

+0

@Mat Soy muy consciente de las clases base virtuales. Sin embargo, C++ no tiene ningún concepto de herencia virtual, o si lo hace no se menciona en el estándar de C++. –

Respuesta

4

El hecho de que el usuario agregue sus propios métodos a una clase secundaria no significa que necesite utilizar la herencia virtual. Lo usaría si, en su biblioteca, tiene una única clase base con varios hijos, y las personas podrían heredar de varias clases secundarias a la vez (por ejemplo, mixin en lugar de sustitución).

4

Para resolver un problema de herencia en forma de diamante. (B y C ambos heredan de A. ¿Qué sucede con los atributos de A en D que hereda de B y C?)

Un cliente de su biblioteca podría ver un RedWidget y un FlyingWidget, y podría querer combinarlos en una RedFlyingWidget.

El usuario tendría que especificar que una de las clases base sea virtual al heredar. Pero eso no es responsabilidad de un creador de bibliotecas.

OOP fluye mejor con la herencia de implementación única, así que eso es lo que usaría en toda la biblioteca.

También hay árboles de "herencia al revés", como se describe en la excelente "Modern C++ Design" de Alexandrescu. Permiten a los clientes obtener más funcionalidades en forma de mezclas que se denominan políticas.

La programación con políticas permite una mayor capacidad de combinar funcionalidad, a expensas de la limpieza sintáctica. Piensa en la implementación de STL, por ejemplo.

+3

no son los métodos por los que debería preocuparse, sino los datos. Si 'A' es una interfaz pura, no hay problema. –

+0

@Matthieu M .: ¡justo! Edité mi respuesta – GregC

+0

La resolución es _ lo que es. La pregunta es si es una buena idea. –

0

Siempre que haya una posibilidad de que los usuarios de su biblioteca utilicen varias clases de su biblioteca como una clase base (es decir, derivadas de ellas), debe usar la herencia virtual. En otras palabras, es una buena idea usarlo en su caso.

1

¿Cuándo es una buena idea la herencia virtual?

Esa es una pregunta de diseño.

Para sus Widgets, yo diría que sí, las clases derivadas múltiples deberían tener la opción de ser solo 1 Widget.

Cuestiones relacionadas