多态对象复制

时间:2016-04-15 08:01:58

标签: c++ copy polymorphism copy-constructor factory-pattern

以下模式陈旧且众所周知。

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. 的对象来创建A类对象
  3. 通过复制A类型的对象
  4. 创建A类对象
  5. 通过复制A类型的对象
  6. 来创建B类对象
  7. 通过复制B类型的对象
  8. 创建B类对象

    我知道案例1包括切片,但这是必要的。 另外我知道案例3没有复制y,这也是需要的(我想使用默认的初始值)。

    所有4个案例都应该是多态的...知道目的地类型但不知道实际的源对象类型。

    如何在不使用RTTI的情况下扩展上述模式(或替代模式将如何显示)?

1 个答案:

答案 0 :(得分: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的构造函数(类似于访问者模式)。