2016-04-15 12 views
0

次のパターンは古く、よく知られています。多型オブジェクトのコピー

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; 
}; 

今私はのオブジェクトからの多型の方法でオブジェクトをコピーしたいと思います。型のオブジェクトから

  • をコピーすることにより、タイプAのオブジェクトを作成し、タイプBのオブジェクト
  • からコピーすることで、タイプAのオブジェクトを作成します

    1. コピーによるB型のオブジェクトを作成します。私のことができるようにしたいですタイプのオブジェクトから
    2. 私はケース1はスライス含まれていることを認識していますタイプB

    のオブジェクトからコピーすることにより、タイプBのオブジェクトを作成するが、これは望まれています。 また、ケース3はyをコピーしないことを認識していますが、これも望ましいです(デフォルトの初期値を使用したい)。

    すべての4つのケースは、宛先タイプを知っていますが、実際のソースオブジェクトタイプを知らない多型で行う必要があります。

    RTTIを使用せずに上記のパターンをどのように拡張できますか(または代替パターンはどのように見えますか)。

  • 答えて

    1

    私が理解から、あなたはタイプAのオブジェクトからコピーすることにより、タイプAのオブジェクトを作成し、タイプB

  • のオブジェクトからコピーすることにより、タイプAのオブジェクトを

    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); } 
    
    • を作成しないこと

    2はA(constA&)が目を行い、多型を必要としないものE

    • は、これら両者をによって処理され

    タイプBのオブジェクトからコピーすることにより、タイプBのオブジェクトを作成するタイプのオブジェクトからコピーすることにより、タイプBのオブジェクトを作成するジョブB(訪問者パターンに類似)のコンストラクタに転送するvirtual CreateB