Wo ist der Fehler (Vererbung)?



  • class Satzzeichen
    {
    protected:
    	unsigned Dauer;
    };
    
    class Note : public Satzzeichen
    {
    	Intervall Note_mod_Oktav;
    	int Oktavierung;
    
    public:
    	Note(Intervall Note_mod_Oktav_, int Oktavierung_, unsigned Dauer_) 
    		: Note_mod_Oktav(Note_mod_Oktav_), Oktavierung(Oktavierung_), Dauer(Dauer_)
    	{}
    };
    

    error C2614: 'Note' : illegal member initialization: 'Dauer' is not a base or member (drittletzte Zeile Ende)



  • hmmmmmmmmmm schrieb:

    error C2614: 'Note' : illegal member initialization: 'Dauer' is not a base or member (drittletzte Zeile Ende)

    Du kannst die Initialisierungsliste nur bei den Teil der Membervariablen verwenden, die direkt zum aktuellen Objektes gehören, nicht den vererbten.

    Was aber möglich ist, der Basisklasse einen Konstruktor zu geben, und diesen aufzurufen:

    class Satzzeichen
    {
      protected:
        Satzzeichen(unsigned Dauer)
        : Dauer(Dauer)
        {
        }
    
        unsigned Dauer;
    };
    
    class Note : public Satzzeichen
    {
      private:
        Intervall Note_mod_Oktav;
        int Oktavierung;
    
      public:
        Note(Intervall Note_mod_Oktav, int Oktavierung, unsigned Dauer) 
        : Satzzeichen(Dauer),
          Note_mod_Oktav(Note_mod_Oktav),
          Oktavierung(Oktavierung)
        {
        }
    };
    


  • Das ist die Initialisierungsliste und Dauer ist bereits initialisiert (respektive wird es von Satzzeichen). Entweder du schreibst einen speziellen Konstruktor für Satzzeichen oder aber du machst daraus eine Zuweisung im Konstruktor.



  • Danke euch beiden! 👍


Anmelden zum Antworten