以下模式陈旧且众所周知。
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包括切片,但这是必要的。
另外我知道案例3没有复制y
,这也是需要的(我想使用默认的初始值)。
所有4个案例都应该是多态的...知道目的地类型但不知道实际的源对象类型。
如何在不使用RTTI的情况下扩展上述模式(或替代模式将如何显示)?
答案 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
的构造函数(类似于访问者模式)。