Ich habe eine Hierarchie: Basis, abgeleitete Klassen und einige Strukturen, die Benutzerdaten als void * speichern. Diese Lücke kann sowohl Basis- als auch abgeleitete Klassenzeiger speichern. Hauptproblem, das ich nicht weiß, was dort Basis- oder abgeleiteter Zeiger gespeichert wird.
%Vor%
Wie void * in das Feld [type] für beide Zeiger konvertieren? Vielen Dank im Voraus.
void*
können nur in ihren ursprünglichen Typ zurückkonvertiert werden. Wenn Sie ein Derived*
in einem void*
speichern, können Sie nur in Derived*
, nicht Base*
zurückgeworfen werden.
Dies ist besonders bei Mehrfachvererbung bemerkbar, da sich Ihr abgeleitetes Objekt nicht unbedingt an derselben Adresse wie Ihre Basis befindet. Wenn Sie Dinge wirklich speichern (und Dinge abrufen) müssen mit void*
, immer zuerst in den Basistyp umgewandelt werden, so haben Sie eine stabile Möglichkeit, das Objekt zurück zu bekommen:
Wenn Sie dann zum abgeleiteten Typ zurückkehren möchten, verwenden Sie dynamic_cast
(oder static_cast
, wenn Sie garantiert vom abgeleiteten Typ sein müssen.)
Wenn Sie die Mehrfachvererbung verwenden, verhält sich das resultierende Objekt intern wie ein zusammengesetztes Konzept, etwa so:
%Vor% Sie erhalten unterschiedliche Adressen für Ihre Instanz von Derived, je nachdem, ob Sie sie in Base1 oder Base2 umwandeln. Sie können also nicht zuverlässig tun, was Sie tun möchten. Sie müssen einen Zeiger auf einen der beteiligten Typen halten und dynamic_cast
Alternativ können Sie Ihre eigenen Regeln erstellen. Sie sagen, dass Sie die Adresse Ihrer Instanz immer in einer bestimmten Basisklasse speichern und immer an diese Basisklasse zurückgeben. Dies ist sehr fehleranfällig, und ich empfehle dringend, wenn möglich, einen Zeiger auf eine gemeinsame Basisklasse zu speichern.
Wenn Sie wissen, dass es sich um einen abgeleiteten Zeiger handelt und Sie einen Basiszeiger erhalten möchten, können Sie dies tun:
%Vor%Sie werden feststellen, dass die Basis * auf eine andere Position als die abgeleitete * zeigt, so dass die intermediäre Besetzung erforderlich ist.