Mehrfachverbung 2 verschiedene Werte für eine Member Variablen
-
Hi, gehe gerade das Buch von Kurt Erlenkötter durch. Folgendes verwirrt mich ...
Kopiere nur die Konstruktoren ... ein "Könner" wird das sicher schon verstehen ...// erbt von Rechteck und Kreis Schablone::Schablone(char *n, float a, float b, float c) : Kreis(n,a) , Rechteck("LEER",b,c) { }// erbt von flaeche Kreis::Kreis(char *n, float a) : Flaeche(n) { radius=a; }// erbt von flaeche Rechteck::Rechteck(char *n, float a, float b) : Flaeche(n) { laenge=a; breite=b; }// Oberste Klasse Flaeche::Flaeche(char *n) { strncpy(farbe,n,10); }void Flaeche::getFarbe() const { cout << "\n" << farbe; }Schablone k_r("GRUEN",20,3,5); k_r.Kreis::getFarbe(); k_r.Rechteck::getFarbe();Consolenoutput:
GRUEN
LEERUnd das will nicht in meine Birne rein. Wir haben ein Objekt mit einer Variablen namens farbe. Wie kann diese verschiedene Werte besitzen ... *kopfweh*
-
Bullz schrieb:
... ein "Könner" wird das sicher schon verstehen ...
Na klar. Wir haben auch sonst nichts zu tun als uns das fehlende zusammenzureimen.

-
Die Membervariable 'farbe' gibt es zweimal, weil sowohl Kreis als auch Rechteck von Flaeche erben:
Schablone - Kreis - Flaeche - Rechteck - FlaecheWenn du in deinem Buch über den Begriff "virtuelle Basisklasse" stößt, dann wiederum kann man es so programmieren, daß Schablone von nur genau einer Flaeche erbt.
-
Swordfish schrieb:
Bullz schrieb:
... ein "Könner" wird das sicher schon verstehen ...
Na klar. Wir haben auch sonst nichts zu tun als uns das fehlende zusammenzureimen.

Sry ... wollte keinen Ärgern. Da ist kein Source code .. da geht es wirklich nur um die mehrfach Vererbung und die Probleme die daraus entstehen für mich...
Th69 schrieb:
Die Membervariable 'farbe' gibt es zweimal, weil sowohl Kreis als auch Rechteck von Flaeche erben:
Schablone - Kreis :leak: - Flaeche - Rechteck - FlaecheWenn du in deinem Buch über den Begriff "virtuelle Basisklasse" stößt, dann wiederum kann man es so programmieren, daß Schablone von nur genau einer Flaeche erbt.
ok ... jetzt hat es geklingelt ... ich dachte das es nur " eine Member " Variable gibt und alle Klassen teilen sich genau diese eine. Verändert eine Kindklasse diese dann ist sie für alle anderen auch geändert....
Aber anscheinend läuft es so ab das geerbte Member Variablen in einer Kindklasse wiederum ihre eigenen Speicherplatz haben und keine Reference auf die Elternklasse sind...
Das macht es aber ziemlich schwierig zu überschauen wenn man 3 Member Variablen die gleich heißen aber unterschiedliche Werte haben können.
-
Genau. Bei normaler, nicht-virtueller Vererbung sind die verschiedenen Basisklassen einer Klasse komplett getrennt voneinander. Sie teilen sich nichts.
Wobei der "dreaded diamond" (=> Google) eher ein Fabelwesen als ein reales Ungeheuer ist. Zumindest ich habe keine Probleme damit, weil er mir noch nie untergekommen ist. Zumindest nicht in Fällen wo es eine Rolle gespielt hätte ob es eine oder zwei Instanzen der Grossvaterklasse gibt.
-
Bullz schrieb:
// erbt von Rechteck und KreisWillste uns veralbern?
-
volkard schrieb:
Bullz schrieb:
// erbt von Rechteck und KreisWillste uns veralbern?
ne
class Schablone : public Kreis, public Rechteckwarum ? ... ist nicht das genau was ich oben geschrieben habe ?
-
Wurstbrot

(Oder war's ne Semmel?)
-
Bullz schrieb:
volkard schrieb:
Bullz schrieb:
// erbt von Rechteck und KreisWillste uns veralbern?
ne
class Schablone : public Kreis, public Rechteckwarum ? ... ist nicht das genau was ich oben geschrieben habe ?
Doch.
Aber was ist eine Schablone, die zugleichg Kreis als auch Rechteck ist? Kann ich mir nicht vorstellen. Haöte ich für einen Designfehler. Entsprechend erübrigt sich jede Antwort, wie man den Fehler nicht korrigiert und irgendwo Werte in Variablen schreibt."Wurstbrot" bezieht sich auf Bücher von Jürgen Wolf, wo zum Verdeutlichen der Vererbung alle Wustbrote Supermärkte sind.
-
Wenn du es genau wissen willst ....
In dem vorrigen Beispiel ging es um einen Ring ... und die Berechnung des Flächeninhalts ...
Ring war Kind von Kreis ... und hatte einen weiteren kleinen Radius und der wurde von der Fläche abgezogen.
Und Schablone ist ein Rechteck das von der Kreisfläche abgezogen wird und dient nur dem Verständnis. Finds sehr komisch das der Herr in seinem Buch keine sprechenden Bezeichner verwendet ... ein n für den Radius ... macht es nicht leichter lesbar als Anfänger vor allen. Ich will aber nicht meckern. Ich habs gecheckt und weiter ..
edit: Der Diamant hat zugeschlagen ...
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {}; so habs ich bei mir.Wenn ich jetzt eine Instanz der Klasse A erstelle und eine member variable von ihr mit cout ausgeben lasse ...
Ambiguous base with multiple inheritance
Auf Stackoverflow steht man soll das zu lösen
class A {};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};Dann hängt er sich auf....
-
Swordfish schrieb:
Bullz schrieb:
... ein "Könner" wird das sicher schon verstehen ...
Na klar. Wir haben auch sonst nichts zu tun als uns das fehlende zusammenzureimen.

hustbaer schrieb:
Wurstbrot

genau deshalb wollt ich mir nicht weiter das hirn verbiegen ...