C++ Vererbung downcasting
Habe ich meine base-Klasse wie folgt:
class point //concrete class
{
... //implementation
}
class subpoint : public point //concrete class
{
... //implementation
}
Wie kann ich Stimmen aus einem point-Objekt zu einem subpoint Objekt? Ich habe versucht, alle drei der folgenden:
point a;
subpoint* b = dynamic_cast<subpoint*>(&a);
subpoint* b = (subpoint*)a;
subpoint b = (subpoint)a;
Was ist falsch mit diesen Besetzungen?
InformationsquelleAutor CodeKingPlusPlus | 2012-08-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht; es sei denn, entweder
point
hat ein conversion operator, odersubpoint
hat eine Konvertierungs-Konstruktor, in welchem Fall das Objekt-Typen umgewandelt werden können, ohne die Notwendigkeit für einen cast.Konnte man Stimmen aus einem
point
Referenz (oder Zeiger) auf einsubpoint
Referenz (oder Zeiger), wenn das genannte Objekt tatsächlich vom Typsubpoint
:Den ersten (
static_cast
) gefährlicher; es ist kein überprüfen Sie, dass die Wandlung gültig ist, so dass, wenna
bezieht sich nicht auf einesubpoint
, dann mitb1
haben Undefiniertes Verhalten.Zweiten (
dynamic_cast
) ist sicherer, wird aber nur funktionieren, wennpoint
ist polymorph (d.h., wenn es eine virtuelle Funktion). Wenna
bezieht sich auf ein Objekt von inkompatiblen Typ ist, dann wird eine Ausnahme geworfen.InformationsquelleAutor
Insgesamt, das wird nicht funktionieren, weil
point
ist nicht einsubpoint
; nur das umgekehrte ist wahr. Allerdings gibt es andere Probleme als gut.In der Reihenfolge:
dynamic_cast
funktioniert nur auf polymorphe Typen, d.h. Typen, die erklären, mindestens eine virtuelle Funktion. Meine Vermutung ist, dasspoint
hat keine virtuellen Funktionen, was bedeutet, es kann nicht verwendet werden, mitdynamic_cast
.Für diese Besetzung zu arbeiten,
point
muss, deklarieren Sie eine Konvertierungs-operatorsubpoint *
, z.B.point::operator subpoint *()
.Für diese Besetzung zu arbeiten, zeigen muss, deklarieren Sie eine Konvertierungs-operator
subpoint
odersubpoint
muss einen Konstruktor, der einen parameter nimmt, convertable auspoint
.InformationsquelleAutor
Für das erste Beispiel
dynamic_cast
funktioniert nur, wenn es mindestens eine virtuelle Methode in der Basisklasse. Und wenn das Objekt nicht tatsächlich der Typ, den Sie versuchen zu casten, wird das Resultat NULL.Für das zweite Beispiel müssen Sie
&a
statta
, aber sobald Sie behoben haben, bekommen Sie Undefiniertes Verhalten, da der Objekttyp ist falsch.Das Dritte Beispiel erfordert eine
operator subpoint()
Methode inpoint
zu tun, einen Umbau während der Erstellung einer Kopie.Ich muss mich wohl falsch verstanden, deine Antwort, es sieht gut aus für mich jetzt.
InformationsquelleAutor
Dem Zweck, ein dynamic-cast ist zu "prüfen zur Laufzeit, ob ein Objekt von einem bestimmten Typ in der Hierarchie". So, jetzt schauen wir uns an, was Sie haben:
Dagegen, das würde gearbeitet haben:
InformationsquelleAutor
a
kann nicht in einesubpoint
. dass die Umsetzung nicht da ist.InformationsquelleAutor
Die Tatsache, dass Sie versuchen, Sie zu tun. Ein
point
ist nicht einsubpoint
, ich würde überrascht sein ob es geklappt hat.InformationsquelleAutor