2016-04-15 78 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; 
}; 

我想從其他對象多態的方式來複制對象。我希望能夠到:

  1. 由B型
  2. 從類型對象的複製
  3. 通過複製創建B類的對象來創建A類對象的對象複製創建類型爲A的對象從類型的對象甲
  4. 通過從乙

類型的對象拷貝創建類型B的對象我知道的情況下1包括切片但這是期望的。 另外我知道情況3不復制y,這也是我想要的(我想使用默認的初始值)。

所有4種情況應該做多態...知道目標類型但不知道實際的源對象類型。

上述模式如何能夠在不使用RTTI的情況下進行擴展(或替代模式如何)?

回答

1

據我瞭解,你可以做

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); } 
  • 由B型
  • 由A型的對象複製創建類型爲A的對象的對象複製創建類型爲A的對象

那兩個不需要多態性,A(constA&)做次È作業

  • 通過從類型A
  • 通過從

這兩個由處理類型B的對象拷貝創建類型B的對象的對象拷貝創建類型B的對象virtual CreateB轉發給B的構造函數(類似於訪問者模式)。