Basisklassen-Zeiger als Membervariable - Wie implementiert man den Copy-Konstruktor?



  • Hallo.
    Wenn ich solchen Code habe:

    class Base
    {
    };
    
    class Test
    {
    private:
       Base* pBase_;
    };
    

    Wie würde ein richtiger Copy-Konstruktor für die Klasse Test aussehen? Im Copy-Konstruktor kenne ich ja nicht den echten Typ der in pBase_ gespeichert ist?!



  • class Base
    {
       virtual Base* clone();
    };
    

    diese virtuelle funktion kann immer nen korrekten klon erzeugen, weil durch die späte bindung genau die richtige clone() aufgerufen wird. so kannste nen Base* kriegen, in dem ne echte kopie liegt.



  • La Coste schrieb:

    class Base
    {
    };
    
    class Test
    {
    private:
       Base* pBase_;
    };
    

    Wie würde ein richtiger Copy-Konstruktor für die Klasse Test aussehen?

    Das kommt darauf an, was für ein Verhalten du brauchst.
    Wenn dein neues Objekt eine tiefe Kopie sein soll, dann brauchst du in einer Basisklasse einen sogenannten "virtuellen Konstruktor" - eine virtuelle Methode die in jeder abgeleiteten Klasse überschrieben wird und eine Kopie des konkreten Objekts macht:

    class Base
    {
    public:
        ...
        Base(const Base&);
        virtual Base* clone() const {return new Base(*this);}
        ...
    private:
        ...
    };
    
    class Derived : public Base
    {
    public:
        ...
        // ruft Base::Base(const Base&) auf und kopiert eigene Member
        Derived(const Derived&);
        Derived* clone() const {return new Derived(*this);}
        // bzw. Base* clone() const {return new Derived(*this);}
        // falls dein Compiler keine Covarianten Return-Types unterstützt
        ...
    private:
        ...
    };
    
    class Test
    {
    public: 
       Test(const Test& other)
           : pBase_(other.pBase_->clone())
       {}
    private:
       Base* pBase_;
    };
    

    http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.6



  • Oh Gott, habe ich wirklich 6 Minuten für den letzten Beitrag gebraucht? 😞


Anmelden zum Antworten