Frage zum casten
-
Ich habe folgendes Programm geschrieben und erhalte an der markierten Stelle den angegeben Fehler:
struct Beispiel { int a; Beispiel():a(1){}; }; struct Erbe_von_Beispiel: Beispiel { int wert1; int wert2; Erbe_von_Beispiel(int wert1_, int wert2_):Beispiel() { wert1 = wert1_; wert2 = wert2_;a=2;}; }; int main() { Beispiel n; //Ein Beispiel erzeugen Erbe_von_Beispiel i(1,2); //Einen Erben von Beispiel erzeugen n=i; //n soll jetzt Erbe_von_Beispiel aufnehmen i=(Erbe_von_Beispiel)n; //zurückkonvertieren zum "Erben von Beispiel" und i zuweisen. /*error C2440: 'type cast' : 'struct Beispiel' kann nicht in 'struct Erbe_von_Beispiel' konvertiert werden Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig*/ return 0; }Warum funktioniert das nicht, da in n ja wirklich eine Struktur vom Typ
"Erbe_von_Beispiel" vorhanden ist?Wie mache ich das richtig?
-
Nein, n ist kein "Erbe_von_Beispiel", sondern ein stinknormales "Beispiel" - auch wenn du dich auf den Kopf stellst

Durch die Zuweisung hast du n den "Beispiel"-Teil von i zugewiesen, die in "Erbe_von_Beispiel" neu hinzugekommenen Teile gingen auf dem Weg verloren - und können durch einen Typcast auch nicht wieder rekonstruiert werden (das klappt nur, wenn du mit Referenzen und Pointern arbeitest - da kann sich der statische und dynamische Typ eines Objekts unterscheiden).
-
ich habe es jetzt so: (zumindest übersetzt er es jetzt ohne Fehler

struct Beispiel { int a; Beispiel():a(1){}; }; struct Erbe_von_Beispiel: Beispiel { int wert1; int wert2; Erbe_von_Beispiel(int wert1_, int wert2_):Beispiel() { wert1 = wert1_; wert2 = wert2_;a=2;}; }; int main() { Beispiel *n= new Beispiel(); //Ein Beispiel erzeugen Erbe_von_Beispiel *i= new Erbe_von_Beispiel(1,2); //Einen Erben von Beispiel erzeugen n=i; //n soll jetzt Erbe_von_Beispiel aufnehmen i=(Erbe_von_Beispiel*)n; //zurückkonvertieren zum Erben von beispiel und i zuweisen. return 0; }Ist das jetzt richtig so?
-
Abgesehen von einem leichten Memory-Leck (zu jedem new gehört auch ein delete) sieht das OK aus.
PS: Schau mal in deinem Lehrbuch nach den C++ Casts (dynamic_cast, static_cast etc.)