Klassenvererbung



  • du hast Recht. Aber ich habe mir schon Gedanken gemacht. Du kannst ja trotzdem mir helfen oder 🙂



  • yeah kennste den >> ~ 😃

    http://www.fun-soft.de/Download/ebooks/c%2B%2Bin21tagen/kap11.html

    les dir des ma durch danach kannst es!!! Die seite bzw. das Buch is eh goiL!



  • Hatte ich vergessen:

    class Alpha {
    private:
        int x;
    
    public:
        Alpha(int n=0) : x(n) {}  //gleiches Spiel
    
        void print() const {
            cout << x;
        }
    };
    

    Das mit dem sizeof - Operator machst du ja richtig, der Rest dürfte kein Problem sein.



  • kannst du lesen? wenn ja, lies dir einfach mal die Aufgabe durch und mach' Schritt für Schritt das, was dort verlangt wurde. (aktuell geht deine Lösung bis zum ersten "und" in Teilaufgabe 2.1 ;))



  • OK. Danke ich werde es jetzt durchlesen. Wenn ich fragen habe komme ich nochmal: 😞



  • Ich habe die Vererbungsgeschichte durchgelesen, aber ich habe eins nicht verstanden:

    class Alpha { 
    private: 
        int x; 
    
    public: 
        Alpha(int n=0) : x(n) {}  //<= Wozu :x(n), vertsehe ich nicht so ganz
    
        void print() const { 
            cout << x; 
        } 
    };
    


  • n wird ja mit 0 init. und isses wie x(0)

    oder net ^^



  • jippi schrieb:

    Ich habe die Vererbungsgeschichte durchgelesen, aber ich habe eins nicht verstanden:

    class Alpha { 
    private: 
        int x; 
    
    public: 
        Alpha(int n=0) : x(n) {}  //<= Wozu :x(n), vertsehe ich nicht so ganz
        
        
        void print() const { 
            cout << x; 
        } 
    };
    

    also ich habe die Beta Klasse bisschen geändert, weil er noch eine Fehlermeldung brachte.

    class Alpha { 
    private: 
        int x; 
    
    public: 
        Alpha(int n=0) : x(n) {}  
    
        int print() const { 
            cout << x; 
    	return x;
        } 
    };
    
    class Beta : public Alpha { 
    private: 
        int y; 
    public: 
        Beta(int y_=0, int x=0) : y(y_), Alpha(x) {}  //Nennt sich Elementinitialiser, schließlich musst du die Basisklasse noch initialisieren 
    
        void print() const { 
            cout <<  "x: " << Alpha::print(); 
            cout <<  "y: " << y << endl; 
        } 
    
    }; 
    
    int main()
    {
    	Alpha a(4);
    	cout << sizeof(a) ;
    
    	return 0;
    }
    

    Als ausgabe kommt jetzt 4 raus.Und Ein Integer wert ist ja 4 - byte groß. Es sollte stimmen. Aber wie gesagt musste ich die printfunktion in der Klasse Alpha ändern.



  • Du hast sie falsch geändert, entweder du machst es so:

    //Alpha print   
    void print() const {
      cout <<  "x: " << x;
    }
    
    //Beta print
    void print() const {
      Alpha::print();
      cout <<  "y: " << y << endl;
    }
    

    oder so:

    //Alpha print   
    int print() const {
      return x;
    }
    
    //Beta print
    void print() const {
      cout <<  "x: " << Alpha::print() << endl;
      cout <<  "y: " << y << endl;
    }
    

    Zu deiner Frage: Das ist ein Elementinitializer, der initialisert x mit n.



  • Es sieht jetzt so aus:

    #include <iostream>
    using namespace std;
    
    class Alpha { 
    private: 
        int x; 
    
    public: 
        Alpha(int n=0) : x(n) {}  
    
        int print() const {  
    		return x;
        } 
    };
    
    class Beta : public Alpha { 
    private: 
        int y; 
    public: 
        Beta(int y_=0, int x=0) : y(y_), Alpha(x) {}  //Nennt sich Elementinitialiser, schließlich musst du die Basisklasse noch initialisieren 
    
        void print() const { 
            cout <<  "x: " << Alpha::print() << endl; 
            cout <<  "y: " << y << endl; 
        } 
    
    }; 
    
    int main()
    {
    	Alpha a(0);
    	cout << "Sizeof Alpha: " << sizeof(a) << endl;
    	Beta b(0);
    	cout << "Sizeof Beta: " << sizeof(b) << endl;
    
    	a.print();
    	b.print();
    
    	return 0;
    }
    

    Als Ausgabe bekomme ich:

    Sizeof Alpha: 4
    Sizeof Beta: 8
    x: 0
    y: 0
    Press any key to continue
    

    Wie kann ich jetzt die Werte von x und y ändern?

    Diesen Elementinitialiser verstehe ich einfach nicht.
    Ich vermute mal:

    Beta(int y_=0, int x=0) : y(y_), Alpha(x) {}  //y(y_) sorgt dafür, dass das erste element y ist und Alpha(x) sorgt dafür dass das zweite element x ist oder?
    


  • Wie kann ich jetzt die Werte von x und y ändern?

    Indem du folgendes einbaust:

    //das muss in Alpha rein:
    void setX(int x_) { x = x_; }
    int getX() const { return x; }
    
    //das muss in Beta rein:
    void setY(int y_) { y = y_; }
    int getY() const { return y; }
    

    Zu deiner main Methode

    int main() {
        Alpha a(1); //x wird hiermit 1
        cout << "Sizeof Alpha: " << sizeof(a) << endl;
        //Beta b(0);  //y gibst du mit 0 an, und x ist defaultmäßig 0
        Beta b(5,4);  //y=5 und x=4
        cout << "Sizeof Beta: " << sizeof(b) << endl;
    
        b.setY(7);  // jetzt ist y 7 
        a.print();
        b.print();
    
        return 0;
    }
    

    Elementinitializer: http://tutorial.schornboeck.net/initliste.htm



  • Ok Danke, dass du mir weitergeholfen hast. Ich melde mich wieder wenn ich fragen habe 🙂



  • Soweit klappt alles ganz gut. Aber bei der Teilaufgabe 2.2 verlangt er, dass ich den Datenelement x "public" machen soll und über Beta::print() darauf zuzugreifen. Ich habe es nicht so ganz verstanden wie ich es realisieren soll.

    class Alpha {    
    
    public:
    	int x; //<= ist jetzt public
    
        Alpha(int n=0) : x(n) {}  //Initialisierungsliste von Alpha
    
        int print() const {  
    		return x;
        } 
    
    };
    
    class Beta : public Alpha { 
    private: 
        int y; 
    	int x; //Teilaufgabe 2.2 Ergänzung von Klasse Beta um Datenelement x.
    public: 
        Beta(int y_=0, int x=0) : y(y_), Alpha(x) {}  //Initialisierungsliste von Beta
    
        void print() const { 
            cout <<  "x: " << Alpha::print() << endl; //<= ????und hier????
            cout <<  "y: " << y << endl; 
        } 
    }; 
    
    int main()
    {
    	Alpha a(1);
    	cout << "Sizeof Alpha: " << sizeof(a) << endl;
    	Beta b(5,3);
    	cout << "Sizeof Beta: " << sizeof(b) << endl;
    	a.print();
    	b.print();
    
    	return 0;
    }
    


  • Ich wußte gar nicht, daß man eine Membervariable so überladen kann 😉
    Egal - auf das Element aus der Basisklasse greifst du mit Alpha::x zu:

    void Beta::print() const
    {
      cout<<"Alpha-Anteil:"<<endl;
      cout<<"x:"<<Alpha::x<<endl;
    
      cout<<"Beta-Anteil:"<<endl;
      cout<<"x:"<<x<<endl<<"y:"<<y<<endl;
    }
    

    PS: Die Umdefinition des Rückgabewertes von print() ist übrigens ganz schlechtes Design - die erstgenannte Variante von GPC ist wohl besser:

    //Alpha print   
    void print() const {
      cout <<  "x: " << x << endl;
    }
    
    //Beta print
    void print() const {
      Alpha::print();
      cout <<  "y: " << y << endl;
    }
    


  • @CStoll: Wenigstens du hast's gemerkt 🙂 Sonst hat keiner meinen faux pas moniert...

    @Jippi: Du solltest dir mal folgendes durchlesen: http://tutorial.schornboeck.net/oop.htm
    Dire fehlt viel Stoff aus dem Bereich.



  • Ok. Es hat geklappt. Danke an euch vielmals. Das Code sieht jetzt so aus und sollte jetzt stimmen. Jetzt kann ich die Aufgabe 3 machen:)

    #include <iostream>
    using namespace std;
    
    class Alpha {    
    
    public:
    
    	int x;
        Alpha(int n=0) : x(n) {}  //Initialisierungsliste von Alpha
    
        void print() const { 
    		cout <<  "x: " << x << endl; 
    	} 
    };
    
    class Beta : public Alpha { 
    private: 
        int y; 
    	int x; //Teilaufgabe 2.2 Ergänzung von Klasse Beta um Datenelement x.
    public: 
        Beta(int y_=0, int x=0, int x_=0) : y(y_), Alpha(x),x(x_) {}  //Initialisierungsliste von Beta
    
        /*void print() const { 
    		Alpha::print(); 
    		cout <<  "y: " << y << endl; 
    	} */
    	void Beta::print() const { 
    	cout<<"Alpha-Anteil:"<<endl; 
    	cout<<"x:"<<Alpha::x<<endl; 
    
    	cout<<"Beta-Anteil:"<<endl; 
    	cout<<"x:"<<x<<endl<<"y:"<<y<<endl;
    	}
    }; 
    
    int main()
    {
    	Alpha a(1);
    	cout << "Sizeof Alpha: " << sizeof(a) << endl;
    	Beta b(5,3,8);
    	cout << "Sizeof Beta: " << sizeof(b) << endl;
    
    	b.print();
    
    	return 0;
    }
    

Anmelden zum Antworten