Verbung, eine Frage



  • Hallo, eine kurze Frage warum folgendes nicht funktioniert

    class Chef
    {
       protected:
            int m;   //m hat für diese Beispiel mal den Wert 5
       public:
            virtual int mGet()
            {
                 return m;
            }
    
    };
    
    class Arbeiter : public Chef
    {
        public:
            Arbeiter();
           ~Arbeiter();
    };
    
    class Feld
    {
          private: 
              int *pFeld    //für hier, annehmen das pFeld mit pFeld = new pFeld[10]            
                              erzeugt wurde
          public:
              int gib(Chef *pC)
              {
                  return(pC->mGet());
              }
    };
    
    int main()
    { 
         Feld *f = new Feld;
         Arbeiter *a = new Arbeiter;
         f->gib(a);
         delete f; delete a;
    }
    

    Ich bekomme keine Fehler beim compileren.
    Das Problem ist f->gib(a) . Es erscheint keine
    Fehlermeldung und beim Ausführen kommt auch kein Fehler, nur es geht eben
    nicht. Die Funktion gib() erwartet ja eigentlich einen Zeiger vom Typ Chef.
    Aber da Arbeiter von Chef erbt, müsste das doch auch gehen.
    Zudem habe ich keine zusätzlichen Methoden in Arbeiter deklariert bzw. definiert.

    Gibt es dafür eine Lösung, oder müsste ich für alles geerbte eine neue Funktion schreiben in der jeweils nur der Zeiger dem zu übergebenden Objekt entspricht ?

    Grüße,
    c-mos



  • Wieso sollte da auch irgendetwas passieren?
    f->gib(a); gibt einen Wert zurück, den du nicht weiterverwendest.



  • c-mos schrieb:

    Das Problem ist f->gib(a) . Es erscheint keine
    Fehlermeldung und beim Ausführen kommt auch kein Fehler, nur es geht eben
    nicht.

    Und das wäre was?

    btw:
    Deine Klassen sind etwas seltsam. Zumindest ist nicht jeder Arbeiter auch ein Chef. Naja, vllt. höchstens sein eigener. 🙂 Und du solltest der Basisklasse auch einen virtuellen dtor spendieren, falls du's nicht schon hast und das beim geposteten Beispiel unter den Tisch gefallen ist.



  • Hallo

    Du solltest dir erstens überlegen, was genau die Funktion macht und was du erwartest und als zweites sollte dir bewusst werden, was public Vererbung bedeutet.

    chrische



  • Ich habe hier manches unter den Tisch fallen lassen.
    Mir gehts eigentlich primär um diese Übergabe.
    Das mit Chef und Arbeiter macht wirklich nicht viel Sinn, stimmt.
    Aber ich habe das nur schnell hingeschrieben damit man sieht
    wo das Problem besteht.

    Mir gehts darum wenn ich eine Klasse habe die mit verschiedenen abgeleiteten Klassen (mit der selben Basisklasse) arbeitet, ob ich dann im Funktionsargument
    void f(Chef *pC) schreiben kann, so dass ich dann alle abgeleiteten Klassen, mit der selben Basisklasse übergeben kann,...oder auch nicht.

    grüße



  • Doch kannst Du.

    (Mal im Ernst, drei Leute haben Dir jetzt erzählt, dass der Code genau das tut was man erwarten würde, könntest Du bitte mal erläutern was "eben nicht geht"?!)



  • c-mos schrieb:

    Mir gehts darum wenn ich eine Klasse habe die mit verschiedenen abgeleiteten Klassen (mit der selben Basisklasse) arbeitet, ob ich dann im Funktionsargument
    void f(Chef *pC) schreiben kann, so dass ich dann alle abgeleiteten Klassen, mit der selben Basisklasse übergeben kann,...oder auch nicht.

    Ja; wenn Chef die Basisklasse ist, kannst Du immer einen Pointer auf ein Objekt einer von Chef abgeleitete Klasse übergeben.

    Noch 'ne Bemerkung: wenn Du nicht wirklich Pointer benötigst, solltest Du auch keine benutzen. Das macht nur Arbeit und man macht eher Fehler. Zum Beieiel im main; warum nicht so:

    int main()
    {
        Feld f;
        Arbeiter a;
        f.gib(&a);
        return 0;
    }
    

    Das gleiche in Feld

    class Feld
    {
          private:
              int *pFeld    //für hier, annehmen das pFeld mit pFeld = new pFeld[10]            
                              erzeugt wurde
    

    ich unterstelle, Du meinst 'pFeld = new int[10]'. Besser wäre dann:

    class Feld
    {
    private:
        std::vector< int > pFeld;
    

    Gruß
    Werner


Anmelden zum Antworten