2016-04-15 11 views
0

Das folgende Muster ist alt und gut bekannt.Polymorphes Kopieren von Objekten

class A 
{ 
public: 
    virtual A* clone() const 
    { 
     return new A(*this); 
    } 

private: 
    int x = 666; 
}; 

class B : public A 
{ 
public:  
    virtual B* clone() const override 
    { 
     return new B(*this); 
    } 

private: 
    int y = 777; 
}; 

Nun möchte Ich mag Objekte in einer polymorphen Weise von anderen Objekten kopieren. Ich möchte in der Lage sein:

  1. Erstellen von Objekten des Typs A durch von Objekten des Typs B Kopieren
  2. Objekte Erstellen von Typ A von Objekten vom Typ Kopieren A
  3. Objekte vom Typ B durch Kopieren Ein
  4. von Objekten des Typs Objekte vom Typ B erstellen von von Objekten des Typs B Kopieren

ich bin mir bewusst, dass der Fall 1 umfasst das Schneiden aber dies gewünscht wird. Auch ich bin mir bewusst, dass Fall 3 y nicht kopieren, das ist auch gewünscht (ich möchte den Standard-Init-Wert verwenden).

Alle 4 Fälle sollten polymorph gemacht werden, da der Zieltyp bekannt ist, aber der tatsächliche Quellobjekttyp nicht bekannt ist.

Wie kann das obige Muster erweitert werden (oder wie würde ein alternatives Muster aussehen), das ohne RTTI möglich ist?

Antwort

1

Von dem, was ich verstehe, Sie

class B; // Forward declaration needed for A::CreateB 

class A 
{ 
public: 
    A() = default; 
    A(const A&) = default; // A(b) will do slicing as expected. 
    virtual ~A() = default; 

    virtual A* clone() const { return new A(*this); } 
    virtual B CreateB() const; // Implementation should go after B definition. 

private: 
    int x = 666; 
}; 

class B : public A 
{ 
public: 
    B() = default; // previous constructor 
    B(const A&a) : A(a) {} // Create B from A (non polymorphic) 
    B(const B&) = default; // Copy constructor (non polymorphic) 

    virtual B* clone() const override { return new B(*this); } 
    virtual B CreateB() const { return B(*this); } 

private: 
    int y = 777; 
}; 

B A::CreateB() const { return B(*this); } 
  • Objekte vom Typ A von Objekten des Typs B durch das Kopieren durch das Kopieren von Objekten des Typs A Objekte vom Typ A
  • einrichten tun können

Die beiden nicht-Polymorphismus erfordert, tut A(constA&) th e Job

  • Objekte vom Typ B Erstellen von von Objekten vom Typ Kopieren A
  • Objekte vom Typ B Erstellen von Objekten vom Typ B
durch Kopieren

Die beide durch behandelt werden virtual CreateB welche an den Konstruktor von B weiterleiten (ähnlich dem Besuchermuster).