Kopierkonstruktor: Objekt A in Objekt B wandeln



  • Hallo,

    ich hab irgendwie gerade ein Brett vorm Hirn. Ich habe ein Objekt B, das von A abgeleitet ist. Innerhalb des Programms möchte ich nun ein Objekt A in Objekt B umwandeln. Wie stelle ich dies am besten an? Mir wurde gesagt, ich solle das mit Kopierkonstruktor machen, nur wie? Hierdurch erstelle ich doch nur eine Kopie von B? Beispiel:

    class A {
    
       public:
          char foo[30];
    
       A(const A &a);
    };
    
    class B : public A {
    
       public:
          int bar;
    
       B(const B &b);
    };
    
    A::A(const A &a) {
    
       for(int i=0; i<30; i++) {
    
          this->foo[i] = a.foo[i];
       }
    }
    
    B::B(const B &b) {
    
       for(int i=0; i<30; i++) {
    
          this->foo[i] = b.foo[i];
       }
    
       this->bar = b.bar;
    }
    

    Ich besitze also eine Instanz von A. Ich brauche jedoch eine Instanz von B aber mit dem Inhalt von A. Wie mache ich denn sowas?

    Vielen Dank!



  • dynamic_cast wenn das A Objekt in wirklichkeit ein B ist.
    Oder Konstruktor von B (neues Objekt erstellen), wenn dies nicht der Fall ist.



  • Shade:
    Aber das B ist ja ein A.

    Stefano2:
    Also du hast eine Basisklasse und eine abgeleitete Klasse. Und du möchtest von einer Basisklasseninstanz auf einmal die abgeleitete Klasse? Wieso instanzierst du nicht gleich die abgeleitete Klasse?
    Es erscheint mir jedenfalls nicht ganz logisch, kann mich aber auch irren, dennoch würde ich darum bitten zu sagen, wozu du diese Umwandlung brauchst.

    MfG MAV



  • Mis2com schrieb:

    Shade:
    Aber das B ist ja ein A.

    Ja, und?
    Was meinst du damit jetzt?

    Jedes A Objekt muss nicht zwangsläufig ein B sein. Wir haben es also mit einem downcast zu tun.



  • OK, sorry, hatte deinen Satz mit: ,ist ein' direkt als das ,ist ein' betrachtet, wie man es sonst verwendet und da sagt man ja:
    Derivded IST EIN Base

    Du meintest aber, dass Base in Wirklichkeit ein Derived ist, sorry. 🙄
    Kann man hier eigentlich auch sagen, dass der dynamische Typ von Base Derived ist (natürlich nur ggf.)?



  • Shade Of Mine schrieb:

    dynamic_cast wenn das A Objekt in wirklichkeit ein B ist.

    Aber bitte nur, wenn A mindestens eine virtuelle Methode hat. Ansonsten bleiben wir doch lieber beim static_cast 😉

    Kann man hier eigentlich auch sagen, dass der dynamische Typ von Base Derived ist

    Ja.


Anmelden zum Antworten