Vererbung/Mehrfachvererbung Konstruktoren
-
Hallo

Ich schlage mich gerade ein bisschen mit Vererbung und Mehrfachvererbung rum. Es funktioniert soweit ganz gut, bis auf die Sache mit den Konstruktoren.
Ich hab die Klassen Girokonto und Festgeldkonto. Diese erben beide von Oberklasse Konto. Konto ist abstrakt und hat einen Standartkonstruktor ohne Argumente. Girokonto und Festgeldkonto haben Argumente.
Nun hab ich die Klasse Flexkonto hinzugefügt, die von Giro und Festgeldkonto erbt. Nun müssen ja die Konstruktoren der Oberklasse aufgerufen werden, nur funktioniert das nicht so ganz. Irgendwas mach ich wohl falsch.Ich bezieh ich mal nur auf die konstruktoren, weil der Rest ja funzt:
Header Girokonto:Girokonto(double, string);Cpp:
Girokonto::Girokonto(double zahl, string name) { saldo = zahl; waehrung = name; ueberziehungslinie=-2000; negativzins=1.09; positivzins=1.002; }Header Festgeld:
Festgeldkonto(double, string);Cpp:
Festgeldkonto::Festgeldkonto(double zahl, string name) { saldo = zahl; waehrung = name; }Und die Klasse Flexkonto:
Flexkonto(double, string); Flexkonto(const Flexkonto& orig); //Hier bekomme ich die selbe Fehlermeldung wie beim KonstruktorFlexkonto::Flexkonto(double zahl, string name){ Girokonto(zahl, name); Festgeldkonto(zahl, name); Girokonto::saldo=zahl; Girokonto::waehrung=name; } Flexkonto::Flexkonto(const Flexkonto& orig) { }Die Fehlermeldung ist "No matching function for call to Girokonto::girokonto()"
"No matching function for call to Festgeldkonto::Festgeldkonto()"Beim Kopierkonstruktor bekomme ich diese Fehlermeldung auch.
Wie mache ich das denn genau mit den Konstruktoren?Vielen dank schonmal für Hilfe

-
Du musst eine Initialisierungsliste benutzen:
Nicht:Flexkonto::Flexkonto(double zahl, string name){ Girokonto(zahl, name); Festgeldkonto(zahl, name); Girokonto::saldo=zahl; Girokonto::waehrung=name; }sondern:
Flexkonto::Flexkonto(double zahl, string name) : Girokonto(zahl, name), Festgeldkonto(zahl, name){}Ähnlich bei dem Kopierkonstruktor, wobei Du da das Problem hast, dass Dein Parameter orig ja zweimal zahl und name besitzt, nämlich einmal aus der Oberklasse Girokonto und einmal aus der Oberklasse Festgeldkonto; ich weiß nicht aus dem Ärmel, wie Du das qualifizieren musst, damit der Compiler das schluckt.
-
Danke
Funktioniert. Hätte nicht gedacht dass es unbedingt eine Initialisierungsliste sein muss.Hat noch jemand eine Idee beim Kopierkonstruktor? Wenn nicht lass ich ihn einfach weg. Nur falls jemand das noch wissen sollte
-
Ach ich hab seit gestern auch noch eine Sache.
Ich versuche das Programm mit Polymorphie zu implementieren. Also hab ich n Array aus Pointern erstellt mit denen sich dann neue Konten hinzufügen lassen.
Konto * kp[100]; cout << "Was für ein Konto möchten sie anlegen? 1. Giro 2. Festgeld 3. Flex? ", cin >> wahl; cout << "Währung festlegen", cin >> waehr; cout << "Startsaldo festlegen", cin >> sald; if(wahl==1) kp[n]=new Girokonto(sald,waehr); else if(wahl==2) kp[n]=new Festgeldkonto(sald,waehr); else if(wahl==3) kp[n]=new Flexkonto(sald,waehr); //Fehlermeldung else cout << "Ungültige Eingabe!" <<endl;Sobald ich eine neue Instanz von Flexkonto anlegen will bekomme ich die Meldung: Konto is an amgibuous base of Flexkonto.
Mit den anderen beiden Klassen funktioniert es.
Was muss ich machen um das zu beheben?
-
Das sagt dir, dass dein Design schlecht ist. Du hast zwei Konten "nebeneinander". Welches soll denn jetzt benutzt werden?
-
Okay habs jetzt. Hab es mit virtuellen Klassen realisiert. Funktioniert.
Ist das worauf du hinauswolltest manni66 oder?
-
Cabooze schrieb:
Okay habs jetzt. Hab es mit virtuellen Klassen realisiert. Funktioniert.
Wirklich?
Cabooze schrieb:
Ist das worauf du hinauswolltest manni66 oder?
Nein. Das mag zwar dein aktuelles Problem lösen, aber bist du jetzt wirklich weiter?
Dein Angaben sind sehr wenig konkret, aber schlussendlich läuft es wohl auf das heraus:struct K { virtual void buchen(double v) = 0; }; struct A : virtual K { void buchen(double v){}; }; struct B : virtual K { void buchen(double v){}; }; struct C : A, B { }; int main() { C aC; aC.buchen(2.2); }Das wird nicht übersetzt. Welches "buchen" soll denn jetzt genommen werden?
BTW, ich habe auch double verwendet. Das ist für Geldbeträge aber eher ungünstig. Warum wird hier im Forum einmal wöchentlich erklärt => Suchfunktion