Frage zur Vererbung



  • Hallo zusammen,

    ich habe eine Frage zur Vererbung:

    #include <iostream>
    using namespace std;
    
    class Account
    {
      private:
        int   AccountNr;
        //...
    
      public:
        // Defaultconstructor
        Account () : AccountNr(999)
        { cout << "1: Account(), AccountNr: " << AccountNr<< endl;  }
    
        // Parameterconstructor
        Account (int aNr) : AccountNr(aNr)
        { cout << "2: Account(int), AccountNr: " << AccountNr<< endl; }
    
    };
    
    class Giroaccount: public Account
    {
      private:
        float Credit;
        // ...
    
      public:
        Giroaccount () : Credit(2000)
        {cout << "4: - Giroaccount(), Cred.: " << Credit<< endl;  }
    
        Giroaccount (float d) : Credit(d)
        { cout << "5: - Giroaccount(float), Cred.: " << Credit<< endl;  }
    
        Giroaccount (int aNr, float d) : Account(aNr), Credit(d)
        { cout << "6: - Giroaccount(int,float), Cred.: " << Credit<< endl;  }
    
    };
    
    int main()
    {
      Giroaccount a, b(5500.0), c(123,1000.0);
      { cout << "Press any key to continue" << endl; }
    getchar();
    return 1;
    }
    

    Wie nennt man z.B. die folgende Schreibweise:

    Giroaccount () : Credit(2000)
    

    Ich kannte das bisher nur so (zumindest von JAVA her):

    Giroaccount ()
        {
           Credit = 2000;
                    cout << "4: - Giroaccount(), Cred.: " << Credit<< endl;  }
    

    Beim erzeugen eines Objektes einer Subklasse muss ja der Konstruktor der Superklasse auch aufgerufen werden.
    Aus Java kannt ich das mit dem Schlüsselwort "super".
    C++ kennt annscheinend das Schlüsselwort super nicht?

    Bei diesem Konstruktor:

    Giroaccount (int aNr, float d) : Account(aNr), Credit(d)
        { cout << "6: - Giroaccount(int,float), Cred.: " << Credit<< endl;  }
    

    Wird ja nicht der Standardkonstruktor der Superklasse aufgerufen sondern der selbst erstellte mit einem Parameter.

    Die Schreibweise ist für mich etwas ungewohnt.

    So wie ich mir das forstelle funktioniert das leider nicht:

    Giroaccount (int aNr, float d)
        {
        Account(aNr);
        Credit = d;
                     cout << "6: - Giroaccount(int,float), Cred.: " << Credit<< endl; 
    
                     }
    

    Wie könnte man das sonst schreiben?

    Vielen DAnk!

    Viele Grüße

    Sören



  • Mahlzeit,

    Sören20 schrieb:

    Wie nennt man z.B. die folgende Schreibweise:

    Giroaccount () : Credit(2000)
    

    Das nennt man Initialisierungsliste.

    Sören20 schrieb:

    Ich kannte das bisher nur so (zumindest von JAVA her):

    Das kannst du in C++ natürlich auch so machen, aber es ist effizienter, wenn du die Variablen in einer Initialisierungsliste initialisierst. Damit werden sie sofort initialisiert und nicht erst erzeugt und dann initialisiert. Bei const und Referen-Membern musst du sogar eine Initialisierungsliste nehmen.

    Sören20 schrieb:

    C++ kennt annscheinend das Schlüsselwort super nicht?

    Richtig. Du kannst allerdings Basisklassen-Methoden aufrufen mit Basisklasse::Methodenname()

    Sören20 schrieb:

    Wie könnte man das sonst schreiben?

    Garnicht. Wenn du explizit einen Basisklassen Ctor aufrufen willst, musst du das in der Initialisierungsliste machen.



  • Danke für die Antwort!

    Wenn ich aus der Subklasse z.B. eine Protected Methode aus der Superklasse aufrufen möchte, wie funktioniert das dann?

    #include <iostream>
    using namespace std;
    
    class Account
    {
      private:
        int   AccountNr;
        //...
    
      public:
        // Defaultconstructor
        Account () : AccountNr(999)
        { cout << "1: Account(), AccountNr: " << AccountNr<< endl;  }
    
        // Parameterconstructor
        Account (int aNr) : AccountNr(aNr)
        { cout << "2: Account(int), AccountNr: " << AccountNr<< endl; }
    
        protected:
        int testen() 
        {
             cout << "TEST HAT FUNKTIONIERT!!!" <<endl;
             return 1;
    }
    
    };
    
    class Giroaccount: public Account
    {
      private:
        float Credit;
        int test;
    
       //das funktioniert nicht
       test = Account::testen();
    
       //Das funktioniert einwandfrei 
        public:
        void test2 () {
    
        test = Account:: testen();
    
         }
    
        // ...
    

    Ich hatte jetzt schon länger nichts mehr mit Java zu tun, allerdings dachte ich das man z.B.

    test = this.testen();
    

    außerhalb einer Methode innerhalb der Klasse aufrufen kann?

    Oder funktioniert das gar nicht?

    Viele Grüße

    Sören



  • Einfach ganz normal

    testen();
    

    aufrufen. Du kannst auch

    this->testen();
    

    schreiben. Der Aufruf muss aber in einer Funktion stehen, das kannst du nicht einfach in die Klasse schreiben. Wenn du Member damit initialisieren willst, benutze den Konstruktor und dessen Initialisierungsliste.

    Übrigens würde ich in C++ eher von Basis- und abgeleiteter Klasse als von Super- und Subklasse sprechen. Dann versteht dich auch jeder. 😉


Log in to reply