Kopierkonstruktor und Clone Methode



  • KasF schrieb:

    ...
    Clone ist weiter oben virtuell ;)...

    Ich weiß ... aber nicht, wieso Du das sagst. 😕
    Wie würdest Du denn diesen Zusammenhang beschreiben wenn nicht mit "overwrite"/"überschreiben" ?

    KasF schrieb:

    ...Das ganze nennt sich irgendwas mit Covariant-Returntyp ( *geedit* 😉 )

    Das kann natürlich sein - das weißt Du dann besser als ich.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    aber nicht, wieso Du das sagst.

    Weil du ja geschrieben hattest, dass der Compiler hier warnen würde, was aber offiziel erlaubt ist, wenn die Funktion virtuell ist.

    Oder habe ich dich falsch verstanden ?



  • ja, KasF hat recht- covariant return types. und der vorteil liegt darin, dass du nicht explizit runtercasten musst, wenn du clone für ein objekt der abgeleiteten klasse aufrust.

    Dog d;
    
    Dog *x = d.clone(); //Fehler ohne covariant return type
    


  • KasF schrieb:

    Simon2 schrieb:

    aber nicht, wieso Du das sagst.

    Weil du ja geschrieben hattest, dass der Compiler hier warnen würde, was aber offiziel erlaubt ist, wenn die Funktion virtuell ist.

    Oder habe ich dich falsch verstanden ?

    Jain - Mein Mißerständnis lag IMO nicht darin, dass die Funktion virtuell sei oder nicht, sondern darin, dass ich die "Toleranz gegenüber covariant return types" nicht kannte, sondern nur von der harten Haltung von Compilern gegenüber variieren return types wusste. 😉

    Also wie auch immer: queer boys Hinweis war richtig und meiner falsch. 😃

    Gruß,

    Simon2.



  • KasF schrieb:

    class A {
       
       public:
               virtual A& func();
    };
    
    class A : public B {
       
       public:
               virtual B& func();
               // Alles im grünen Bereich ;), das virtuell kann man aber auch hier
               // weglassen, würde ich aber trotzdem hinzuschreiben, damit man
               // sieht, dass die Funktion virtuell ist.
    };
    

    es ist nicht compilierbar unter VC6 sowie

    virtual Dog* Clone() const {return new Dog (*this);}
    

    error C2555: 'B::func' : overriding virtual function differs from 'A::func' only by return type or calling convention.
    hab aber kein problem unter vc7



  • @Simon2 wenn ich jetzt gerade nicht völlig daneben liege, wird sich kein compiler darüber beschwere, da
    Dog* Clone()
    und
    Mammal* Clone()
    schlicht zwei verschiedene funktionen sind. wenn man im kind Mammal* Clone() implementiert, muss man halt nur darauf achten, dass man nie
    Dog* hund=Mammal::Clone() ausführt, da dann die funktion des elternobjekte aufgerufen wird, also Dog* Dog::Clone().



  • Was soll die Methode Clone eigentlich für einen Sinn haben? Die Bezeichner tiefe und flache Kopie finde ich auch schwachsinnig, entweder man kopiert ein Objekt oder eben nicht.
    Was ist der Vorteil hiervon:

    Mammal* dog = new Dog();
    Mammal* dog2 = dog->Clone();
    

    gegenüber hiervon?

    Mammal* dog = new Dog();
    Mammal* dog2 = new Dog( *dog );
    

    Das "Clone" kenne ich so nur von Java, dort hat's sicherlich auch seine Berechtigung, in C++ ist es imho aber Unsinn. Es ist völlig normal und etabliert, Kopien mit dem Kopierkonstruktor zu erzeugen, wozu also Clone? Keep things simple as possible, oder so ⚠



  • ghorst schrieb:

    @Simon2 ...

    Du weißt aber schon, dass das Thema in diesem Thread schon vor fast einem halben Jahr abgeschlossen wurde, oder ? Die Antwort steht auch schon weiter oben. 😉 😃

    Gruß,

    Simon2.



  • @simon2 ich habe den nicht ausgegraben und zu meiner schande muss ich gestehen, schaute ich nicht, wann du deinen beitrag hier geschrieben hast. sollte ich aber in zukunft wieder machen. 😉



  • ghorst schrieb:

    @simon2 ich habe den nicht ausgegraben ...

    Weiß ich wohl - ist mir auch schon öfter passiert. Kein Problem !
    😃

    Gruß,

    Simon2.


Anmelden zum Antworten