Konvertierung von void * in den Zeiger der Basisklasse

8

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.

    
tga 26.03.2011, 20:32
quelle

4 Antworten

16

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:

%Vor%

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.)

    
GManNickG 26.03.2011, 20:51
quelle
4

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

verwenden

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.

    
Erik 26.03.2011 20:47
quelle
1

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.

    
Jollymorphic 26.03.2011 20:41
quelle
-2

Verwenden Sie dynamic_cast , es kann Ihnen dynamisch sagen, ob der Zeiger auf ein Base -Objekt zeigt oder nicht.

    
Puppy 26.03.2011 20:43
quelle

Tags und Links