Basisklasse auf abgeleitete Klasse anwenden



  • Guten Abend,

    vielleicht stehe ich gerade etwas auf dem Schlauch aber ich habe folgenden Code:

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Mensch
    {
    public:
    	string Vorname;
    	string Nachmane;
    	int    Alter;
    	string Wohnort;
    };
    
    class Komiker : public Mensch
    {
    public:
    	string Geschieden;
    	double Gehalt;
    	int    Arbeitstage;
    };
    
    int main()
    {
    	Mensch *Otto   = new Mensch();
    	Otto->Vorname  = "Otto";
    	Otto->Nachmane = "Waalkes";
    	Otto->Alter    = 63;
    	Otto->Wohnort  = "Emden";
    
    	Komiker *Waalkes     = Otto;
    	Waalkes->Geschieden  = "Ja";
    	Waalkes->Gehalt      = 10000;
    	Waalkes->Arbeitstage = 6;
    
    	return 0;
    }
    

    Ich versuche also eine Instanz einer Basisklasse einer abgeleiteten zuzuweisen. Aber das funktioniert nicht. Klappt das überhaupt?? Und wenn ja, wie?
    Eigentlich würde ich vermuten, dass es funktioniert, da ja die abgeleitete ja die selben Eigenschaften hat wie die Basisklasse.



  • Naja, ein Mensch ist halt auch kein Komiker. Der braucht z.B. auch weniger Speicehr. Das macht so keinen Sinn.



  • Die Zuweisung

    Komiker *Waalkes     = Otto;
    

    ist falsch.

    Jeder Komiker ist ein Mensch. Das heisst du kannst einen Komiker einer Mensch-Variable zuordnen.
    Aber nicht jeder Mensch ist ein Komiker. Deswegen kannst du ohne explizite type-casts (die man meiden sollte) nicht einen Menschen einem Komiker zuweisen.

    Was muesste bei der Zuweisung:

    Komiker *Waalkes     = Otto;
    

    denn deiner Meinung nach genau passieren? Otto ist ein Mensch, das heisst er hat die Eigenschaften Geschieden, Gehalt, Arbeitstage (eventuell) gar nicht. Mit welchen Werten sollen die denn bei der Zuweisung initialisiert werden? Du siehst, dass die Zuweisung nicht sinnvoll ist.

    Haettest du zu Beginn die Zuweisung

    Mensch *Otto   = new Komiker();
    

    gehabt, dann koenntest du ueber static_cast oder dynamic_cast die Zuweisung

    Komiker *Waalkes     = dynamic_cast<Komiker>(Otto);
    

    machen. Aber implizit funktioniert das nicht.



  • #include <iostream>
    #include <string>
    using namespace std;
    
    class Mensch
    {
    public:
        string Vorname;
        string Nachmane;
        int    Alter;
        string Wohnort;
    };
    
    class Komiker : public Mensch
    {
    public:
        string Geschieden;
        double Gehalt;
        int    Arbeitstage;
    };
    
    int main()
    {
        Komiker *Otto   = new Komiker();
        Otto->Vorname  = "Otto";
        Otto->Nachmane = "Waalkes";
        Otto->Alter    = 63;
        Otto->Wohnort  = "Emden";
        Otto->Geschieden  = "Ja";
        Otto->Gehalt      = 10000;
        Otto->Arbeitstage = 6;
    
        return 0;
    }
    

    Probiers mal so.



  • Ich merke schon, das Beispiel mit dem Komiker und dem Mensch ist nicht so ganz toll:-P

    Es geht eigentlich um eine Sache, die mir auf der Arbeit keine Ruhe gelassen hat.
    Also in Wirklichkeit konsumiere ich einen WebService. Dort bekomme ich einen vector<Klasse> zurück. Von dieser Klasse wollte ich eine Klasse ableiten die um zwei Eigenschaften erweitert wurde. Aus Bequemlichkeit dachte ich mir jetzt, dass ich mir einfach ein neues abgeleitetes Objekt erstellen, das Objekt der Basisklasse zuweisen und dann die beiden anderen neuen Eigenschaften befüllen könnte. Einfach nur weil ich faul bin:-P



  • Bei vector<T> würd ich sagen Stichwort Covariance. Ist problematisch. Ansonsten geht das wie gesagt nicht und macht auch keinen Sinn.



  • secondsun schrieb:

    Dort bekomme ich einen vector<Klasse> zurück. Von dieser Klasse wollte ich eine Klasse ableiten die um zwei Eigenschaften erweitert wurde. Aus Bequemlichkeit dachte ich mir jetzt, dass ich mir einfach ein neues abgeleitetes Objekt erstellen,

    Gib Deiner abgeleiteten Klasse einen Konstruktor, der als Parameter ein Objekt vom Typ der Basisklasse bekommt.


Anmelden zum Antworten