C++: mit Typinformation zu testen, Klasse, Vererbung
Ich habe einen Zeiger auf eine polymorphe Art, p
. Ich habe auch ein type_info
für eine Klasse, die irgendwo in der gleichen Hierarchie ti
.
Wenn ich nur vergleichen Sie die typeid(*p) == ti
, dann kann ich den test zur Laufzeit, ob der Zeiger verweist auf eine direkte Instanz der Klasse.
Ist es ähnlich wie mit C++'s RTTI um zu testen, ob *p
erbt, die von dieser Klasse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Möglichkeit, dies zu tun in der standard-C++ alleine. Wenn Sie eine Umsetzung, die die Itanium C++ ABI1, die Sie tun können diese aber, zum Beispiel:
Hier dies funktioniert, weil der Typ hat einen einzigen, nicht-virtuallly geerbt Basis. Sie können support-Fälle sind zwar mit Sorgfalt und ähnliche
dynamic_casts
.Dies ist zwar möglich, unter diesen Umständen denke ich, du bist der Lösung das falsche problem - eine Lösung, die basierend auf einem
std::map
ist mehr tragbar und vermeidet es, sich auf Einzelheiten der Implementierung, wie diese.1 verwirrenderweise den Namen, es ist eine überraschend große compiler/Architektur-Liste, nicht nur Itanium
Ja, Sie können
dynamic_cast<>
für diesen Zweck. Wenn Sie versuchen, zu werfen, umBase*
ist, führt er eine Laufzeit überprüfen, um zu sehen, ob Ihr wirklich Klasse ist abgeleitet vonBase
(oder direkt eine Base). Im Falle des Scheiterns,dynamic_cast<>
zurücknullptr
. Beispiel :Seite Knoten :
wenn
dynamic_cast<>
wird verwendet, um zu konvertieren Zeiger, es gibt entwedernullptr
oder der Zeiger umgewandelt.ABER wenn
dynamic_cast<>
wird verwendet, um zu konvertieren Referenzen es wirft ein Ausnahme im Falle des Scheiterns.Dem Laufzeit-check der
dynamic_cast<>
ist nur möglich bei polymorphen Typen. Wenn Ihre Basis enthält keine virtuelle Funktion (= nicht-polymorphe), ist es nicht möglich, sicher zu konvertierenBase*
zu einemDerived*
.dynamic_cast<>
funktioniert nur, wenn ich weiß, was die Klasse auf compile time. Ich weiß nicht, dass: alles, was ich habe, ist eintype_info
für die Klasse. Ich weiß nicht wirklich brauchen, zu wirken die Zeiger, lediglich bestimmen, ob das Objekt wird darauf an erbt von der Klasse, für die ich dietype_info
.Großer Dank an Flexo. Ich habe Erforschung der C++ - ABI für eine ganz Weile. Nach einer Stunde Arbeit habe ich dieses demo: http://pastebin.com/j7DYY5ej. Hier ist ein code, um zu überprüfen Vererbung in einigen Fällen. Ich habe implementiert die Operatoren ==, !=, <, >, <=, >= für den Typen. Ich bin Planung zu verbessern, diese Art von Typ Gleichung und verwenden Sie es in mein Projekt.
Beachten Sie, dass ich benutzt G++ 4.8 unter Linux.