Zugriff auf proteced-variablen der Basisklasse



  • Moin zusammen
    Ist sicherlich eine recht simple Frage und wurde wohlmöglich bereits gestellt - mir fallen nur keine Suchwörter mehr ein, unter denen ich es finden könnte o.O

    Folgendes Problem:
    Ich habe zwei Klassen. In Klasse eins wird ein Tiername in eine Variable gespeichert, in Klasse zwei soll dieser Name ausgegeben werden.
    Wie mache ich das?

    So sieht das aus:

    class Tier
    {
    protected:
    	string name;
    public:
    	Tier(string n) : name(n) {};
    
    	virtual void info () = 0;
    };
    
    class Saeugetier : public Tier
    {
    protected:
    	int lebenserwartung;
    public:
    	Saeugetier(int l, string n) : lebenserwartung(l), Tier(n) {};
    	void info ()
    	{
    		cout << "Saeugetier, Name: " << [b]Tier::name[/b] << endl;
    	};
    
    };
    

    Das fettgedruckte ist mein Problem. über "name", "Tier->name" und viele illsutre Verteilungen von "&" und "*" quer über diese beiden Begriffe bekomme ich keinen Zugriff (Was meiner Meinung nach nicht verwundern sollte, da ich ja lediglich an den public-Teil "herankomme"). Meist bekomme ich die Nachricht (bezogen auf das vorangehende <<) "Kein <<-Operator stimmt hiermit überein".

    Kann mir jemand sagen, wie ich es dennoch schaffe, dass ich den Tiernamen ausgeben lassen kann? Bedingung ist allerdigs, dass meine Vererbung public ist und ich nichts an der Klasse "Tier" ändere.

    (Und nein, ihr würdet mir nicht die Hausaufgaben hiermit machen, ich versuche lediglich gerade meine Schwächen zu entdecken und zu "verüben" 😉 )



  • Einfach nur name.



  • Nayamis schrieb:

    Saeugetier(int l, string n) : lebenserwartung(l), Tier(n) {};
    

    Ich dachte der Konstruktoraufruf der Basisklasse muss immer zuallererst in der Initialisierungsliste stehen 😕



  • Danke für deine Antwort, aber leider sagt mir mein Programm dann noch immer "Kein <<-Operator stimmt mit diesen Operanden überein" 😞

    @Gugelmoser: Ehm... Ja. Danke, ich hab's geändert 🙄 hat nur leider mein Problem nicht beseitigt.

    Edit 3:
    Ich bin ein Esel.
    Ich hab vergessen, <string> einzubinden 😣 *facepalm*
    Danke trotzdem an euch beide 😃



  • Gugelmoser schrieb:

    Nayamis schrieb:

    Saeugetier(int l, string n) : lebenserwartung(l), Tier(n) {};
    

    Ich dachte der Konstruktoraufruf der Basisklasse muss immer zuallererst in der Initialisierungsliste stehen 😕

    Ist doch völlig egal. Die Reihenfolge der Initialisierung hängt von der Deklarationsreihenfolge ab und nicht von der Reihenfolge, in der man die Initialisierungsliste schreibt. Daher wird der Konstruktor der Basisklasse immer als erstes aufgerufen, egal wo man das hinschreibt. Trotzdem sollte man das natürlich in der richtigen Reihenfolge schreiben, um Verwirrungen vorzubeugen.


Log in to reply