D
Danke euch ALLEN schonmal für die verschiedenen Ideen!
Die von @DocShoe vorgeschlagene Variante funktioniert soweit gut, nur bin ich mir auch nicht ganz sicher, ob das undefiniertes Verhalten ergibt. Ich hab ein bisschen recherchiert und folgendes gefunden:
Any object pointer type T1* can be converted to another object pointer type cv T2*. This is exactly equivalent to static_cast<cv T2*>(static_cast<cv void*>(expression)) (which implies that if T2's alignment requirement is not stricter than T1's, the value of the pointer does not change and conversion of the resulting pointer back to its original type yields the original value). In any case, the resulting pointer may only be dereferenced safely if the dereferenced value is type-accessible.
Dazu gab' noch folgendes Beispiel:
struct S { int x; };
struct T { int x; int f(); };
struct S1 : S {}; // standard-layout
S s = {};
auto p = reinterpret_cast<T*>(&s); // value of p is "pointer to s"
auto i = p->x; // class member access expression is undefined behavior;
// s is not a T object
p->x = 1; // undefined behavior
p->f(); // undefined behavior
S1 s1 = {};
auto p1 = reinterpret_cast<S*>(&s1); // value of p1 is "pointer to the S subobject of s1"
auto i = p1->x; // OK
p1->x = 1; // OK
Quelle: https://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_accessibility
Ist das jetzt nun UB oder nicht? Ich meine, wir leiten mit dem
class TControlElementAccessor : public TControl { __published: __property Font; };
TControlElementAccessor* accessor = reinterpret_cast<TControlElementAccessor*>( control );
TFont* font = accessor->Font;
ja nur von der Base-Klasse ab und verändern da nix außer die Sichtbarkeit. Das wäre doch eigtl so wie beim obigen Beispiel mit S1. Nur auf der anderen Seite ist ein TControl natürlich kein TControlElementAccessor-Objekt, sondern nur andersrum, was widerum für UB sprechen würde.
Edit: Eigtl müsste das ganze legal sein, denn es funktioniert auch mit static_cast anstatt reinterpret_cast. Und spätestens da sollte doch der Compiler meckern, wenn ich da was ungültiges reinfüttere.