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.)


Anmelden zum Antworten