Anfängerfrage (const | virtual)
-
hat jemand eine idee?
-
Stamu schrieb:
hat jemand eine idee?
Nach 2 Stunden schon ungeduldig? Geduld ist eine tugend, und die Hilfe der Leute hier freiwillig UND Kostenlos.
Aber damit du nicht dumm stirbst: neuesA ist private, da kommt ne abgeleitete Klasse nicht dran.
-
das mit dem private war Tippfehler von mir soll protected sein
Zu dem keine Geduld und dem Rest:
Es ist jedem klar das hier die Leute freiwillig UND Kostenlos helfen, dafür sind auch alle dankbar. Deine Antwort auf die Frage (... nicht dumm stirbst ...) ist naja lassen wir das.
-
Stamu schrieb:
das mit dem private war Tippfehler von mir soll protected sein
dann würde ich an deiner Stelle nochmal den Code ohne tippfehler posten, denn ich seh da noch ein paar andere "Tippfehler".
-
Danke für den hinweis hier der code sollte nun stimmen
class A { public: virtual double foo() const; protected: char temp; }; class B : public A { protected: A neuesA; }; class C : public B { public: B(char a) { temp = a; }; double foo() const; };so wenn ich nun in der cpp folgendes machen will:
double C::foo() const { return B::neuesA.foo(); }sagt er mir das es foo nicht gebe für neuesA, aber ich vererbe es ja an alle klassen und es muss ja überschrieben werden also hat ja eigentlich jeder ein foo oder nicht?
-
Stamu schrieb:
sagt er mir das es foo nicht gebe für neuesA, aber ich vererbe es ja an alle klassen und es muss ja überschrieben werden also hat ja eigentlich jeder ein foo oder nicht?
Wie lautet die Fehlermeldung denn genau? Irgendwas in Richtung "unresolved external symbol"?
Ich seh einfach nur, dass A keine implementation von foo() hat. Bei virtuellen funktionen brauchst du immernoch einen Funktionsrumpf.
-
undefined reference to `A::foo() const' ist die Meldung
Bin davon ausgegangen das er ja sieht das die foo Funktion in jeder Unterklasse überschrieben wird. Würde es was bringen wenn ich die ganze Klasse sozusagen abstract mache mit = 0?
-
Du willst eine Methode aufrufen die es nicht gibt, wie soll das gehen?
-
Stamu schrieb:
Bin davon ausgegangen das er ja sieht das die foo Funktion in jeder Unterklasse überschrieben wird. Würde es was bringen wenn ich die ganze Klasse sozusagen abstract mache mit = 0?
Jap. pure virtual(=0) weist den compiler explizit darauf hin, dass die Funktion keinen Körper hat.
Nebenbei ist es für neuesA egal, ob die abgeleiteten Klassen überschrieben sind. Denn neuesA hat den dynamischen typ A, es ist ein echtes Objekt der Basisklasse, keine abgeleitete Klasse. (ich wette, dass du vergessen hast dass C++ Im gegensatz zu Java nicht alle Objekte als referenz speichert, sondern dass C++ einen Unterschied zwischen Objekt, Referenz und Zeiger macht)
-
otze schrieb:
Stamu schrieb:
Bin davon ausgegangen das er ja sieht das die foo Funktion in jeder Unterklasse überschrieben wird. Würde es was bringen wenn ich die ganze Klasse sozusagen abstract mache mit = 0?
Jap. pure virtual(=0) weist den compiler explizit darauf hin, dass die Funktion keinen Körper hat.
Nicht ganz. Eine virtuelle Funktion, die nicht rein virtuell ist, muss definiert werden, eine rein virtuelle Funktion kann definiert werden. Wäre foo in A eine rein virtuelle FUnktion, so wäre A abstrakt und die Definition als Member von B nicht möglich.
-
Danke für die Tipps hat nun geklappt.