virtuelles object kopieren



  • hallo
    mal angenommen ich habe sowas hier :

    class abstract
    {
    virtual void func1() = 0;
    
    };
    
    class deriv : public abstract
    {
    void func() { foo() }
    }:
    

    nun reiche ich sowas in irgendeine function rein

    void sammle(const abstract * ptr)
    {
    // ich würde nun gerne das ding kopieren um es in einem container zu halten
    // und damit die verantwortung furs löschen zu haben aber damit gehts nicht :
    abstract * m_ptr = new abstract(*ptr);
    }
    

    fehlermeldung ist :
    cannot allocate object of abstract type wegen pure-virtual-functions

    damit hat er ja recht, aber wie kann ich trotzdem das ding kopieren?
    virtueller copy-ctor?
    ich weiss echt nicht weiter



  • In etwa so:

    class abstract
    {
    virtual void func1() = 0;
    virtual abstract* clone() = 0;
    
    };
    
    class deriv : public abstract
    {
    void func() { foo() }
    abstract* clone()
    {
      return new deriv(*this);
    }
    }:
    
    void sammle(const abstract * ptr)
    {
    abstract * m_ptr = ptr->clone();
    }
    


  • Die clone-Methode sollte imho konstant sein, sie verändert ja das Objekt selbst nicht. Außerdem ist es möglich den Rückgabetyp anzupassen (kenne leider den Namen des Features nicht mehr):

    class abstract
    {
    public:
    	virtual void func() = 0;
    	virtual abstract* clone() const = 0;
    };
    
    class deriv : public abstract
    {
    public:
    	void func() { foo(); }
    	deriv* clone() const
    	{
    		return new deriv(*this);
    	}
    };
    
    void sammle(const abstract * ptr)
    {
    	abstract* m_ptr = ptr->clone();
    }
    


  • Don06 schrieb:

    kenne leider den Namen des Features nicht mehr

    Kovariante Rückgabewerte. 😉

    Der Return-Wert einer virtuellen Funktion kann in einer abgeleiteten Version durch einen More-Derived-Typen ersetzt werden.


Anmelden zum Antworten