Die RTTI Umsetzung ist dann doch besser?
Besser wäre die Lösung, die ohne Type Lookup auskommt. Für was genau brauchst du diesen Enum? Wenn du Code hast, der nur ein UIControl bekommt und dann rausfinden muss, ob es sich um einen Button handelt, dann hast du ganz weit oben irgendwo einen
Designfehler. Code, der jedes UIControl annimmt, muss mit jedem UIControl umgehen können, unabhängig davon, um was für eine Art UIControl es sich konkret handelt. Code, der nur mit Buttons funktioniert, sollte von vorn herein nur einen Button annehmen. Wenn du Code hast, der jedes UIControl annimmt und dann unterscheiden muss, ob es sich um einen Button handelt oder nicht, dann zeigt das auf, dass dein Design in sich selbst widersprüchlich ist (entweder ist das Interface von UIControl unpassend oder das Interface das das UIControl annimmt). Die gute Lösung ist nicht, mit RTTI (in welcher Form auch immer) die Symptome zu verschleiern, sondern den Widerspruch zu beseitigen...
Die Initializer-Listen kenne ich aus der C++ Vorlesung, die sind mir nur irgendwie unleserlicher vorgekommen.
Das kommt dir dann wohl nur so vor weil du C++ nicht gewohnt bist. Im Gegensatz zur Zuweisung im C'tor Body (bei der der Member erst default-initialized wird und dann einen neuen Wert bekommt), wird in der Initializer Liste direkt initialisiert. Beachte: Zwischen Initialisierung und Zuweisung besteht ein
wesentlicher Unterschied! Es gibt Dinge wie z.B. Konstanten oder Referenzen, die nur durch eine Initialisierung einen Wert bekommen/gebunden werden können...