2016-04-15 34 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的构造函数(类似于访问者模式)。