Zugriff auf virtuelle Methode einer UnterKlasse



  • Hallo erstmal,
    hoffe Ihr könnt mir da weiterhelfen.

    Ich habe einen Klasse:

    class bxObject
    {
    private:   
        string Name;
        int ObjectNr;
    	...
    public:
    
       bxObject(string pName);
       ...
    };
    

    Und eine geerbte Klasse mit einer virtuellen Methode:

    class bxVisObject : public bxObject //visual object
    {
    public:
    
        bool Visible;
        float XPos;
        float YPos;
        float ZPos;
    
        bxVisObject(string pName); 
    //virtuelle Methode:
        virtual void GenerateObject() = 0;
    
        void SetPosition(float pXPos, float pYPos, float pZPos);
        void Hide() {Visible = false;};
        void Show() {Visible = true;};
    };
    

    Nun habe ich eine Liste(ein vector) die auf Objekte der Klasse bxObject zeigt und in einer Funktion sollen alle sichtbare Objekte (bxVisObject) gezeichnet werden.

    hier: z.B. std::vector<bxObject*> ObjectList;

    ...

    ObjectList[2].GenerateObject()

    Aber man kann auf GenerateObject() nicht zugreifen da es sich um bxObject - Liste handelt.

    In Pascal konnte man einfach mit bxVisObject(ObjectList[i]).GenerateObject; darauf zugreifen.

    P.S.: versuche gerade meine Delphi Programme in C++ um zuschreiben (kenn mich mit C++ nicht so gut aus)


  • Administrator

    Wenn du weisst, dass der bxObject Zeiger auf ein bxVisObject zeigt und du keine Mehrfachvererbung drin hast, dann kannst du das folgende machen:

    bxVisObject* visObject = static_cast<bxVisObject*>(ObjectList[i]);
    visObject->GenerateObject();
    

    Bei Mehrfachvererbung, aber du weisst, dass es ein bxVisObject ist:

    bxVisObject* visObject = dynamic_cast<bxVisObject*>(ObjectList[i]);
    visObject->GenerateObject();
    

    Du weisst es nicht mit Sicherheit:

    bxVisObject* visObject = dynamic_cast<bxVisObject*>(ObjectList[i]);
    
    if(visObject)
    {
      visObject->GenerateObject();
    }
    else
    {
      // Nope, ist kein bxVisObject ...
    }
    

    Aber ganz allegemein, solche Downcasts sind in C++ meistens eher ein Hinweis auf einen Designfehler. Ich rate dir also, dass du mal dein Design ein wenig überdenkst. Gerade auch wenn ich lese, dass du deine Programme portierst, dann solltest du aufpassen, dass du nicht probierst delphimässig in C++ zu programmieren. Programmiersprachen unterscheiden sich, die Lösungsansätze sind unterschiedlich und die Möglichkeiten auch.

    Grüssli



  • MasterJ schrieb:

    ...
    Nun habe ich eine Liste(ein vector) die auf Objekte der Klasse bxObject zeigt und in einer Funktion sollen alle sichtbare Objekte (bxVisObject) gezeichnet werden....

    Da liegt der Fehler. :p 😉

    Wenn Du eine Liste aller bxVisObject brauchst, solltest Du auch so eine anlegen und verwenden.

    BTW: So rein vom Namen her ist mir nicht klar, warum bxVisObject eine Funktion GenerateObject() besitzt, bxObject aber nicht....

    Gruß,

    Simon2.



  • Jo Danke für die schnelle Antwort 🙂

    @Simon2
    Nicht alle Objekte der Klasse bxObject werden gezeichnet, es werden nur die Objekte die von der Klasse bxVisObject abgeleitet sind gezeichnet.

    Zwei Listen zu benutzen wäre eine Idee.



  • MasterJ schrieb:

    ...
    Nicht alle Objekte der Klasse bxObject werden gezeichnet, ...

    Aha ... da hatte ich unter "GenerateObject" etwas Anderes verstanden. Vielleicht solltest Du es eber "Draw()" oder so nennen ("GenerateVisObject()" ?) ...

    Gruß,

    Simon2.


Log in to reply