Polymorphie und *_cast
-
Hallo zusammen,
hab ein kleines Problem/logischen Fehler mit Polymorphie:Ich habe eine Basis-Klasse mit, wer denkt es sich schon?, Basis-Eigenschaften (class Object). Von dieser Klasse entsprechend abgeleitet Klassen mit Zusatz-Eigenschaften (class ObjectName oder weitere).
#ifndef _OBJECT_H #define _OBJECT_H class Object { public: Object (); virtual ~Object (); void setPos ( const float a_pos ); float getPos ( ) const; private: float m_f_pos; }; #endif // #ifndef _OBJECT_H #ifndef _OBJECT_STATION_H #define _OBJECT_STATION_H #include "Object.h" class ObjectName : public Object { public: ObjectStation (); ~ObjectStation (); void setName ( const string& a_name ); string getName ( ) const; private: string m_str_name; }; #endif // #ifndef _OBJECT_STATION_HZur Organisation der Objekte benutze ich einen vector mit Elementen der Basis-Klasse.
#ifndef _FINDER_H #define _FINDER_H class Finder { public: Finder (); ~Finder (); Object* doFind ( const string& a_name ); private: vector < Object > m_vec_objects; }; #endif // #ifndef _FINDER_HDer vector wird wie gewuenscht mit Objekten der abgeleiteten Klasse gefuellt.
// creating object+filling vector ObjectName obj; obj.setPos ( a_pos ); obj.setName ( a_name ); m_vec_objects.push_back ( obj );Das Problem: Beim Zugriff auf 'ObjectName::getName' steht nur Mist im Speicher.
// fetching values ObjectName* obj = reinterpret_cast<ObjectName*>find->doFind ( a_name ); obj->getPos(); // ok obj->getName(); // not error but useless valuesHab ich einen schweren logischen Fehler gemacht?
PS: SuFu hat mir nicht weitergeholfen.
PPS: Benutze MSVC++, denke aber das es eine Grundlegendes C++ Problem auf meiner Seite ist.
-
Google nach "Slicing".
Du speicherst Objekte im Vektor.
Du willst Pointer auf Object in deiner Liste speichern!vector < Object* > m_vec_objects;// nachtrag
Dann brauchst du auch keinen reinterpret_cast sondern einen dynamic_cast.
-
Vielen Dank fuer die Antwort. Das ist eine Lösung und auch die die angewendet wurde.
#ifndef _FINDER_H #define _FINDER_H class Finder { public: Finder (); ~Finder (); Object* doFind ( const string& a_name ); private: vector < Object* > m_vec_objects; }; #endif // #ifndef _FINDER_H// creating object+filling vector ObjectName* obj = new ObjectName(); obj->setPos ( a_pos ); obj->setName ( a_name ); m_vec_objects.push_back ( obj );// fetching values ObjectName* obj = dynamic_cast<ObjectName*>find->doFind ( a_name ); obj->getPos(); // ok obj->getName(); // okPasst wunderbar. Problem war allerdings, dass vector<Object> nicht durch mich sondern durch Zuarbeit entstanden ist. In Zusammenarbeit (einfach vector<Object*> war nicht genug...) mit der entsprechenden Person wurden die entsprechenden Änderungen eingepflegt und gut.
Merce!