Vererbung klappt nicht
-
Hi, es geht um eine simple vererbung. Die Basisklasse besteht aus den großen 3 und zwei funktionen. Die Kindklasse nur aus den großen 3.
Fehlermeldung: No matching function for call to hallo::hallo ()...
In der Fehlermeldung wird dann auf die Kindklasse verwiesen.#include <iostream> using namespace std; class hallo { protected: int id; int rakete; int bombe; public: explicit hallo (int ID) : id (ID) { cout << "Konstruktor, Id: " << id << endl; rakete = 5; bombe = 10; } ~hallo () { cout << "Virtual Konstruktor, id: " << id << endl; } hallo (const hallo& rhs) { cout << "Virtual Kopierkonstruktor, Id: " << id << endl; } virtual void zeigedaten () { cout << "Aktuelle Raketen und Bombenanzahl\n" "Bomben: " << bombe << endl << "Raketen: " << rakete << endl; } void waffen () { bombe--; rakete--; cout << "Waffen wurden abgefeuert\n"; } }; class tschuess : public hallo { tschuess () { cout << "Tschuesskonstruktor"; } ~tschuess () { cout << "Tschuess geloescht"; } tschuess (const tschuess& rhs) { cout << "Kopier Tschuesskonstruktor"; } }; int main () { hallo halloe(1); tschuess ts(1); halloe.waffen(); halloe.zeigedaten(); }
-
Wenn Du nichts weiter in der Initialisier-Liste des abgelittenen Konstruktors angibst, wird die Basisklasse Default-Konstruiert. Aber Deine Basisklasse hat keinen Default-Konstruktor.
-
Was ist so schwierig daran, die Meldung zu kopieren? Kein Mensch will deine halbgaren Umschreibungen lesen!
Du hast keinen Defaultkonstruktor in hallo. Das wird in der Meldung wohl auch so stehen.
-
~hallo () { cout << "Virtual Konstruktor, id: " << id << endl; } hallo (const hallo& rhs) { cout << "Virtual Kopierkonstruktor, Id: " << id << endl; }Konstruktoren können nicht virtuell sein.
Und überdenk mal deine Benamsung ("hallo", "tschuess", "waffen" - WTF?).
-
kamelkacke schrieb:
Die Basisklasse besteht aus den großen 3
Nö...zumindest nicht in dem von dir geposteten Code.
Und zu dem was Hustbaer schon meinte:
Wolltest du vielleicht 'virtueller Destruktor schreiben'?
Dann mach ihn auch virtuell. Wäre ja richtig.
-
Also ein Konstruktor kann nicht virtuell sein, aber ein destruktor?
Ansonsten was ist eine initialisierungsliste. Der Inhalt des Konstruktors oder die deklarationszeile mit dem parametern? Ich hab beides geändert und bekomme trotzdem den selben fehler:/data/data/com.n0n3m4.droidc/files/temp.c: In constructor 'tschuess::tschuess(int)':
/data/data/com.n0n3m4.droidc/files/temp.c:51:45: error: no matching function for call to 'hallo::hallo()'
explicit tschuess (int kacke) : shit (kacke) {
^
compilation terminated due to -Wfatal-errors.Die Änderungen:
class tschuess : public hallo { private: int test; bool fuck; int shit; public: explicit tschuess (int kacke) : shit (kacke) { cout << "Tschuesskonstruktor"; test = 5; fuck = true; cout << id; } ~tschuess () { cout << "Tschuess geloescht"; } tschuess (const tschuess& rhs) { cout << "Kopier Tschuesskonstruktor"; } void zeigedaten () { cout << "Abgeleitet zeigedaten";} };Ps sry für die benamung, werde in zukunft drauf achten
-
Der Fehler wird auch drin bleiben, bis du
- einen Defaultkonstruktor für "hallo" schreibst
oder
- den einzigen existierenden Konstruktor von "hallo" aufrufst
-
ja hallo, gehirn einschalten bitte:
decimad schrieb:
Wenn Du nichts weiter in der Initialisier-Liste des abgelittenen Konstruktors angibst, wird die Basisklasse Default-Konstruiert. Aber Deine Basisklasse hat keinen Default-Konstruktor.
das bedeutet, dass du in allen konstruktoren von allen abgeleiteten klassen den konstruktor der basisklasse explizit aufrufen musst.
und ich kann hustbaer nur zustimmen, was sind das wieder für bezeichner? wem hilft sowas weiter?
-
Ok, danke leute.
@ felix: die zweite option verstehe ich nicht. Soll der hallo konstruktor in tschuess eingebaut werden? Bzw der konstruktor soll abgeleitet werden(sofern ich richtig verstanden habe), aber wie?
Ach ja, dass es keine virtuellen Konstruktoren gibt weiss ich, aber virtuelle destruktoren?
-
kamelkacke schrieb:
Ach ja, dass es keine virtuellen Konstruktoren gibt weiss ich, aber virtuelle destruktoren?
Virtuelle Destruktoren gibt es, virtuelle Konstruktoren hingegen nicht. Das hat den Grund, das eines von beiden sinnvoll ist, das andere Unsinn. Wann und wie sollte jemals ein virtueller Konstruktor aufgerufen werden? Man kann schließlich unmöglich einen Basisklassenzeiger auf ein nicht existerendes Objekt haben. Der ganze Vorgang der Konstruktion eines Objekts impliziert, dass man schon weiß, was für ein Objekt es ist*.
*: Ich rede hier von der C++-Ebene, nicht von höheren Abstraktionsstufen, wie einem factory pattern.