Yo soy un estúpido

Pues sí. Después de pasar dos días tratando de averiguar por qué no se mostraba correctamente el código en 2d, descubrí dos cosas. Primero, que el orden de búsqueda de las funciones de una clase cuando son derivadas es Derivada->base, solo si has declarado ese miebro en la clase derivada como no virtual. En mi caso, la clase widget implementa un método virtual void redraw()=0; y su clase hija window un método cuya declaración correcta debe ser void redraw(); y no virtual void redraw();. Me he castigado debidamente por ese error pillándome las orejas con la bandeja de la unidad de CDs.
El segundo horrible disparate era en el constructor de la clase widget. Había cometido la burrada de usar los mismos nombres de los miebros x,y,w,h para los parámetros. Obviamente eso... mejor ni mencionar qué sucedía. La mesa se encargó de pegarme varias veces en la cabeza para que no se repitan tan vergonzosos errores.
Por el lado de las buenas noticias, la clase que maneja los temas es un singleton. En serio. Y además, funciona. Al menos por ahora.

Comentarios

  1. Umh, quizás no haya entendido muy bien lo que te pasó, pero en C++ cuando tu tienes una base con un método virtual, si en la derivada declaras un método del mismo nombre, este pasa a ser virtual también. De hecho lo correcto sería marcarlo como virtual.

    ResponderEliminar
  2. Pues ahora que reviso mi libro ni yo mismo sé lo que me pasó. Solo que si declaro ambos miebros como virtuales se ejecuta primero el de la clases base. Si ya me estaba volviendo lo co porque no veía la razón por la cual no se mostraba nada.

    ResponderEliminar

Publicar un comentario