C ++ - typeid (), verwendet für die abgeleitete Klasse, liefert keinen korrekten Typ

8

Vielleicht verstehe ich nicht, wie Vererbung hier funktioniert, aber hier ist mein Problem:

Ich habe eine Klassenoption und eine Klasse RoomOption, die davon abgeleitet ist. Ich habe einen anderen Klassenraum, der einen Vektor von shared_ptrs enthält. In main füge ich eine RoomOption zu diesem Vektor hinzu. Dann, mit typeid () überprüfe ich den Typ, und es sagt mir eine Option. Von dem, was ich gelesen habe, soll Typid abgeleitete Typen zurückgeben, und shared_ptrs verursachen nicht das Schneiden, also bin ich nicht sicher, was ich falsch mache.

Hier ist der Code:

Room.h:

%Vor%

Room.cpp:

%Vor%

main:

%Vor%

Es kommt mir vor, dass beim Hinzufügen oder Abrufen einer Option die RoomOption aufgrund des Rückgabe- / Argumenttyps als Option ausgegeben wird. Wenn das der Fall ist, wie soll ich einen Vektor von mehr als einem Typ speichern? Oder verstehe ich das alles falsch? = \

    
Jean Finley 14.07.2012, 13:07
quelle

3 Antworten

1

Zuerst, um die Typid des shared_ptr zu bekommen.

Dann sollten Sie anstelle von typeid dynamic_cast verwenden. ZB:

%Vor%     
Paranaix 14.07.2012, 13:16
quelle
14

Das typeid funktioniert für polymorphe (für Klassen mit mindestens einer virtuellen Funktion) und nicht-polymorphe Typen anders:

  • Wenn der Typ polymorph ist, wird die entsprechende typeinfo -Struktur, die ihn repräsentiert, zur Laufzeit bestimmt (der vtable-Zeiger wird üblicherweise für diesen Zweck verwendet, aber dies ist ein Implementierungsdetail)

  • Wenn der Typ nicht polymorph ist, wird die entsprechende typeinfo-Struktur zur Kompilierzeit bestimmt

In Ihrem Fall haben Sie tatsächlich eine polymorphe Klasse Option , aber shared_ptr<Option> itsef ist überhaupt nicht polymorph. Es ist im Grunde ein Container mit einem Option* . Es gibt eine absolut keine Vererbungsbeziehung zwischen Option und shared_ptr<Option> .

Wenn Sie den echten Typ erhalten wollen, müssen Sie zuerst den echten Zeiger aus seinem Container mit Option* shared_ptr<Option>::get() :

extrahieren %Vor%

Oder alternativ (es ist genau dasselbe):

%Vor%     
Frédéric Terrazzoni 14.07.2012 13:21
quelle
1

Der Objekttyp, auf den ein shared_ptr<Option> zeigt, ist Teil seines Wertes, nicht sein Typ. Also diese Codezeile ist kaputt:

%Vor%

Du willst das:

%Vor%

Oder vielleicht:

%Vor%

Was typeid macht, sagt dir den tatsächlichen Typ der Sache, die du an sie weitergegeben hast. Du hast es als shared_ptr<Option> übergeben. Es sieht nicht in das Objekt, um zu sehen, was es enthält.

    
David Schwartz 14.07.2012 13:11
quelle

Tags und Links