Klassenvererbung



  • 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