C++ Vererbung unverständlich

D

derBobby

Gast
Hallo zusammen,

habe wieder etwas gefunden, das mir unverständlich ist. Ich hänge die Dateien einfach mal an, weil ich denke, dass es sonst zu unfangreich wird, um es hier in Code Tags reinzustellen.

Zum Verstädnis:
- Es gibt die Klasse A, die zwei private int besitzt
- Es gibt die Klasse Ba, die zwei private char besitzt.
- Die Klasse Ba erbt von A

Wieso funktioniert das da nicht? (int sind von A geerbt)
Ba::Ba(char x,char y, int v, int w) : char1(x), char2(y), int1(v), int2 (w)

Das da aber schon?:
Ba::Ba(char x,char y, int v, int w) : char1(x), char2(y){
setInt1(v);
setInt2(w);
cout << "K:Ba" << endl;
}

Wieso gibt meine überladene Funktion:
cout << ba1 << endl;
andere Werte für die int wieder als die direktere Funktion:
cout << ba1.getInt1() << endl;

Zum ausprobieren habe ich für beide Funktionen die Ausgabe der Adresse mit reingeschrieben, aber ich verstehe auch nicht, warum die Funktionen die int-Werte von verschiedenen Adressen zurückliefern?

Gruß und Dank,
derBobby
 

Anhänge

derBobby schrieb:
Wieso funktioniert das da nicht? (int sind von A geerbt)

Weil sie private sind. ;)

Du kannst im Konstruktor von B den Konstruktor von A korrekt aufrufen:
Code:
B::B(int a, int b, char c, char d)
: A( a, b)
, c_( c)
, d_( d)
{
}

Wieso gibt meine überladene Funktion:
cout << ba1 << endl;
andere Werte für die int wieder als die direktere Funktion:
cout << ba1.getInt1() << endl;
Weil B wie auch A auch Membervariablen namens int1 und int2 hat. Die Membervariablen aus B haben mit den Membervariablen aus A nichts zu tun. Durch den gleichen Namen werden sie in B überladen - ansonsten würde der Compiler die Member aus A sehen und sich über das private stören.

P.S.: Hast du vorher mal PHP gemacht?
 
Zuletzt bearbeitet:
Zum ersten Zeil:

Ba x(1, 2, 'c', 'd')

würde dann einmal ein Objekt von Ba erzeugen und zusätzlich eines von A? So dass ich mit x.getChar1() und
x.A::getInt1() (geht das so? o.O)
auf die Werte zugreifen müsste?

Zum zweiten Teil:

Ja, sie werden in Ba überladen. Aber einmal bekomme ich die richtigen und einmal die falschen Werte. Das verstehe ich nicht.

PHP nie gemacht!
 
Zuletzt bearbeitet von einem Moderator:
und zusätzlich eines von A
Nein, Vererbung ist eine is-a und keine has-a Beziehung. Also soweit du gemeint hast, die Variablen etc. der Basisklasse würden dann alle doppelt (einmal im "Ba-Objekt" und einmal im "A-Objekt") angelegt.

Ich habe mir eben deinen Code angeschaut. Du brauchst int1 und int2 nicht nocheinmal in Ba deklarieren. Damit du wie ursprüngl. gewünscht einfach auf die Variablen von A zugreifen kannst, etwa im Konstruktor, musst du vor der Deklaration von A eine forward-declaration von Ba machen und diese dann als friend class von A definieren.
 
Zuletzt bearbeitet:
Würdest du mir vielleicht die Dateien entsprechend anpassen? Die Beschreibung ist grade zu viel für mich. Ich sitze seit Stunden hier und versuche mich am Vererben. Ich hab grad das berühmte Brett vor dem Kopf. Da geht nix mehr rein... :freak:
 
derBobby schrieb:
Ich sitze seit Stunden hier und versuche mich am Vererben. Ich hab grad das berühmte Brett vor dem Kopf. Da geht nix mehr rein... :freak:

Pause machen. ;) Ernstgemeinter Hinweis - sonst hast du garnichts davon.
 
Da gebe ich 7H3 N4C3R vollkommen recht.

Wenn du dann wieder "frisch" bist, einfach mal nach den Schlagwörtern wie "friend class C++" oder "forward declaration C++" googeln ;)

Wenn du dann noch Fragen hast, kannst du diese gerne stellen (ich denke auf diese Weise hast du am meisten davon, weil du selbst darauf kommst, und dann wohl das ganze schneller lernst - und das ist wohl der Zweck deines Programms, soweit ich das sehe).
 
zum lernen würd ich dir ncoh den tipp geben die classen usw.. sinnvoll zu benames
damit kann man leichter logische strukturen aufbaun
z.b.
Code:
Klasse Auto mit intPS, intRäder, dblMaxKmH
Klasse BMW welche von Auto geerbt mit boolSitzheizung

so wird manches viel einfacher verständlich weil man den sprachgebraucht wie gewohnt umsetzten kann
und nicht wie bei
Code:
Klasse A mit int1 int2 int3
KLasse Ba welche von A geerbt mit chr1 chr2 chr3
 
Zuletzt bearbeitet:
Zurück
Oben