Logikproblem bei der Vererbung [gelöst]



  • manni66 schrieb:

    Du initialisierst keine der Variablen.
    Im Konstruktor der Basisklasse kannst du nicht auf Werte einer abgeleiteten Klasse zugreifen, da sie noch nicht "vorhanden" sind.

    Dankeschön.
    Dass die Variable in Starthandlung nicht initialisiert ist, ist mein Fehler (zu stark gekürzt). Ich änder das schnell oben.
    Der zweite Satz sagt schon alles, was ich wissen muss.



  • Eine kleine Frage noch:
    Kann ich den Basiskonstruktor auch gezielt mit Argumenten aufrufen und nicht nur automatisch?
    Dann könnte ich die ID als Argument übergeben.



  • Klar geht das. Aber du kannst natürlich nicht die Membervariable der abgeleiteten Klasse übergeben, die gibt's da ja noch nicht.



  • In deinem Beispielcode befindet sich keine Basisklasse. Meinst du

    class Starthandlung : public Handlung
    

    ?
    Und was hat es mit der (Member)Variablen 'speicherId' auf sich? Wo ist diese deklariert?



  • Das mit der fehlenden Vererbung war ein Versehen, hab's geändert.
    Die speicherId-Variable ist nirgendwo deklariert, das ist ja gekürzt hier. Ist halt das Teil, was bei Programmende gespeichert wird.



  • Mich hat nur gewundert, daß du in beiden Klassen eine Membervariable 'long id' hast.



  • Ist ID automatisch in der Unterklasse, wenn es auch in der Basisklasse ist? Wusste ich gar nicht.



  • Dafür gibt es ja Vererbung, damit Kind-Klassen die gleichen Eigenschaften und Funktionen bereitstellen können.



  • Wenn du also die Id in der Basisklasse speichern willst, dann benutze so etwas:

    class Handlung
    {
    public:
        Handlung(long id)
          : id(id) // <- Initialisierungsliste
        {
        }
    
        long Id() const { return id; }
    
    private:
        long id;
    };
    
    class Starthandlung : public Handlung
    {
    public:
        Starthandlung() : Handlung(1)
        {
        }
    };
    

    Falls dich die doppelten Bezeichner ('id') stören, dann kannst du ja eine der Namen ändern ('id_' oder 'm_id').

    Beachte aber, daß jetzt jedes Objekt 'StartHandlung' die gleiche Id hat (also hier 1).
    Wenn du doch je Objekt eine unterschiedliche Id haben willst (falls es also mehrere StartHandlung-Objekte gibt und du diese unterscheiden möchtest), so könntest du dies mit einer 'static'-Membervariablen lösen (welche bei jedem Objekt dann inkrementiert wird).



  • Interessant. An die Initialisierungsliste hatte ich gar nicht mehr gedacht.


Anmelden zum Antworten