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_H
    

    Zur 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_H
    

    Der 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 values
    

    Hab 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(); // ok
    

    Passt 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!


Anmelden zum Antworten