dynamic_cast von "void *"
Laut diesevoid*
hat keine RTTI-Informationen, also eine Umwandlung von void*
ist nicht legal, und es macht Sinn.
Wenn ich mich richtig erinnere, dynamic_cast
aus void*
wurde auf gcc.
Können Sie bitte klären.
InformationsquelleAutor der Frage dimba | 2010-11-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
dynamic_cast
funktioniert nur auf polymorphe Typen, d.h. Klassen mit virtuellen Funktionen.Im gcc können Sie
dynamic_cast
zuvoid*
aber nicht von:InformationsquelleAutor der Antwort vitaut
In
5.2.7 - Dynamic cast [expr.dynamic.cast]
es sagt, dass fürdynamic_cast<T>(v)
:T
ist ein Zeiger-Typv
ist ein rvalue, der einen Zeiger auf komplette Klasse TypT
ist ein Referenz-Typ,v
ist ein lvalue einer kompletten Klasse Typ (Dank usta für die Kommentare auf meine fehlende)...
v
ist ein Zeiger oder ein lvalue einer polymorphen TypSo, Nein, ein
(void*)
Wert ist nicht erlaubt.Lassen Sie uns darüber nachdenken, was Ihre Anforderung könnte bedeuten: angenommen, Sie haben einen Zeiger, der wirklich zu einem
Derived1*
aber der codedynamic_cast
-ing nur weiß, dass Sie einevoid*
. Lassen Sie uns sagen, Sie versuchen zu casten, um eineDerived2*
wo beide abgeleiteten Klassen haben eine gemeinsame Basis. Oberflächlich gesehen, könnte man denken, alle Hinweise würden auf den gleichenBase
Objekt, das enthalten würde, ein Zeiger auf den entsprechenden virtuellen dispatch-Tabelle und RTTI, so dass alles zusammen hängen könnte. Aber, beachten Sie, dass abgeleitete Klassen können mehrere Basis-Klassen, und damit der BedarfBase
Klasse sub-Objekt möglicherweise nicht dieDerived*
- nur alsvoid*
- zeigt. Es würde nicht funktionieren. Fazit: der compiler muss wissen, diese Typen, so dass es ausführen kann, sind einige Anpassungen an den Zeiger auf der Grundlage der Arten beteiligt.(Einige Antworten sprechen über die Notwendigkeit, die Zeiger sind Sie Gießen aus, um eine polymorphe Art, mit virtuellen Funktionen. Das ist alles gültig, aber ein bisschen irreführend. Wie Sie oben sehen können, auch wenn die
void*
ist so ein Typ es immer noch nicht zuverlässig arbeiten, ohne die vollständige information in der Art, wie das eigentliche problem ist, dassvoid*
ist vermutlich Hinweis auf den start des abgeleiteten Objekts, in der Erwägung, dass müssen Sie einen Zeiger auf die Basisklasse sub-Objekt, aus dem die cast-Typ leitet.)InformationsquelleAutor der Antwort Tony Delroy
Es ist wahr, dass
void*
können nichtdynamically_cast
ed.Sind Sie wahrscheinlich falsch erinnern.
Mit g++ 4.5 und folgenden code
Bekomme ich die folgende Fehlermeldung:
InformationsquelleAutor der Antwort Motti
Ich denke, Sie verwechseln mit
dynalic_cast
zuvoid*
. Das ist legal und erhält den Zeiger auf die abgeleitete Klasse Objekt.dynamic_cast
vonvoid*
illegal ist - der Typ gecastet von polymorph - Sie enthalten mindestens eine virtuelle Funktion (virtual Destruktor zählt auch).InformationsquelleAutor der Antwort sharptooth
Können Sie werfen einen Zeiger auf polymorphe Art zu
void *
aber nicht Umgekehrt.InformationsquelleAutor der Antwort usta