Bereichsoperator in Vererbung in einer Zeile



  • Hallo

    Kann mir jemand erklären was hier geschieht:

    Saeugetier::Saeugetier(const string s,const string s2):Tier(s,s2){}
    Vogel::Vogel(const string s,const string s2):Tier(s,s2){}
    Kriechtier::Kriechtier(const string s,const string s2):Tier(s,s2){}
    

    Also hier wird irgendwas aus der Klasse Tiere geerbt. Aber was soll hier der Bereichsoperator? Ich habe den Prof gefragt und habe nur einen Antwort bekommen: "Ich habe keine Zeit, Googlen Sie einfach nach Vererbung mit Bereichsoperator"

    Leider ergab meine Suche keinen zufriedenstellenden Erfolg.


  • Mod

    Saeugetier::Saeugetier(const string s,const string s2):Tier(s,s2){}
    

    Das heißt:
    1.

    Sauegetier::
    

    Das was nun folgt, gehört zur Klasse Sauegetier. Dies meint dein Prof vermutlich mit Bereichsoperator. Der hat aber mit Vererbung rein gar nichts zu tun.
    2.

    Sauegetier(
    

    Dies ist eine Funktion mit dem Namen Sauegetier. Aus 1. folgt, dass dies ein Konstruktor der Klasse ist, da der Name der Funktion der Klassenname ist.
    3.

    const string s,const string s2)
    

    Dies sind die Parameter der Funktion.
    4.

    :
    

    Es folgt eine Initialisierungsliste. Falls nicht bekannt, googlen. Ganz wichtig.
    5.

    Tier(s,s2)
    

    Der Member oder die Basisklasse mit dem Namen Tier (je nachdem, was Tier genau ist) wird wie hier geschrieben initialisiert.
    6.

    {}
    

    Der eigentliche Funktionskörper des Konstruktors ist leer.

    Die anderen Zeilen haben die gleiche Bedeutung für jeweils andere Klassen. Aus dem Zusammenhang ergibt sich, dass Tier höchstwahrscheinlich eine gemeinsame Basisklasse ist.

    Entweder ist dein Prof verwirrt/ahnungslos oder du hast ihn falsch verstanden. Such dir aus, was du für wahrscheinlicher hältst.



  • Es gibt eine Vererbungshierarchie. Von der Basisklasse Tier sind drei weitere Klassen abgeerbt: Säugetier, Vogel und Kriechtier.

    Im Konstruktor dieser abgeleiteten Klassen wird in der Initialisierungsliste zuerst der Konstruktor von Tier aufgerufen, wobei die Parameter "durchgereicht" werden.

    Der Bereichsoperator "::" hat mit Vererbung absolut gar nichts zu tun. Dieser ist notwendig, wenn du eine Klassenmethode außerhalb der Klassendeklaration definierst.

    class A {
     A(int i);
     void machWas();
     void machWasAnderes() 
     {
       cout << "blabla" << endl;
      } 
    };
    
    A::A(int i)
    {
      cout << i << endl;
    }
    
    A::machWas()
    {
      cout << "mach was" << endl;
    }
    

    edit: zu langsam...



  • Wobei die Funktion MachWas noch ein void davor benötigt, um erstellt zu werden 😉

    void A::machWas()
    {
      cout << "mach was" << endl;
    }
    

    MfG


Anmelden zum Antworten