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? = \
Zuerst, um die Typid des shared_ptr zu bekommen.
Dann sollten Sie anstelle von typeid dynamic_cast verwenden. ZB:
%Vor% 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()
:
Oder alternativ (es ist genau dasselbe):
%Vor% Der Objekttyp, auf den ein shared_ptr<Option>
zeigt, ist Teil seines Wertes, nicht sein Typ. Also diese Codezeile ist kaputt:
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.
Tags und Links c++ inheritance typeid