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 continueWie 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; }