Por supuesto que puedes, solo me pregunto si es racional diseñar de esa manera.
Estoy haciendo un clon y estaba haciendo un diseño de clase. Quería usar la herencia, aunque no es necesario, para aplicar lo que aprendí en C ++. Estaba pensando en el diseño de clase y se me ocurrió algo como esto:
GameObject -> clase base (consta de miembros de datos como desplazamientos xey), y un vector de SDL_Surface *
MovableObject: GameObject -> clase abstracta + clase derivada de GameObject (un método void move () = 0;)
NonMovableObject: GameObject -> clase vacía ... no hay métodos o miembros de datos que no sean constructor y destructor (¿al menos por ahora?).
Más tarde, planeaba derivar una clase de NonMovableObject, como Tileset: NonMovableObject. Me preguntaba si a menudo se usan clases abstractas "vacías" o simplemente clases vacías ... Me doy cuenta de que de la manera que estoy haciendo esto, solo estoy creando la clase NonMovableObject solo por el bien de la categorización.
Sé que estoy pensando demasiado para hacer un clon de ruptura, pero mi enfoque está menos en el juego y más en usar la herencia y diseñar algún tipo de marco de juego.
fuente
MovableObject
tampocoNonMovableObject
pueden heredar el uno del otro, los dos tienen una ubicación; como tal, ambos deben ser consumibles por código que, por ejemplo, quiere dirigir la puntería de un monstruo hacia un objeto sin tener en cuenta si ese objeto podría moverse o no.Tiene aplicaciones en C # como se menciona en ammoQ, pero en C ++ la única aplicación sería si quisieras tener una lista de punteros de objetos no móviles.
Pero me imagino que estarías destruyendo los objetos a través del puntero NonMoveableObject, en cuyo caso necesitarías destructores virtuales, y ya no sería una clase vacía. :)
fuente
Una situación en la que puede ver esto es donde desea que una colección fuertemente tipada contenga tipos heterogéneos. No digo que sea una gran idea, puede indicar una abstracción débil o un diseño deficiente, pero sucede. Como mencionas, es una forma de categorizar cosas y puede ser útil y perfectamente válido.
Por ejemplo, quieres una colección para guardar gatos y perros. En su diseño, usted decide que tienen mucho en común, así que tenga una clase base de Mamal y use este tipo en su colección (por ejemplo, Lista). Todo bien. Luego decides que quieres agregar algunas ranas a tu colección, pero no son mamals, por lo que una forma de hacerlo sería hacer que Frogs and Mamals sea una subclase de Animal, pero tal vez no puedas pensar mucho en las ranas y mamals que tienen en común para que el animal se quede vacío. Luego escribes tu colección con Animal en lugar de Mamal y todo está bien.
En la vida real, encuentro que incluso si creo una clase base vacía, tarde o temprano, alguna funcionalidad termina allí, pero ciertamente hay momentos en que existen.
fuente