这是我的问题。我有一个接口和两个派生类:
class Interface
{
public:
virtual void f() = 0;
};
class Derived1 : public Interface;
class Derived2 : public Interface;
然后,我还有一个包含shared_ptr的Value类,其目的是指向两个派生类中的一个:
class Value
{
public:
Value();
Value(const Value&);
private:
shared_ptr<Interface> p_;
};
由于我希望我的Value类像值一样运行,我希望我的复制构造函数能够复制指向的Derived对象。但是,我不能写
Value::Value(const Value& value) :
p_(make_shared<Interface>(*value.p_))
{ }
因为Interface包含纯虚函数。 *value.p_
必须是派生类型。我不知道如何妥善处理这个问题。
提前致谢。
答案 0 :(得分:0)
我不知道如何妥善管理这个问题。
为什么不使用虚拟clone()方法?
class Interface
{
public:
virtual void f() = 0;
virtual std::shared_ptr<Interface> clone()=0;
};
class Derived1 : public Interface {
void f() {};
std::shared_ptr<Interface> clone()
{
return std::make_shared<Derived1>(*this);
}
};
然后在你的拷贝构造函数中,你可以使用类似下面的东西来复制指针:
Value::Value(const Value& value)
{
this->p_ = value.p_->clone();
}
以此为例:http://www.cs.technion.ac.il/users/yechiel/c++-faq/copy-of-abc-via-clone.html
答案 1 :(得分:0)
这个问题正是建议的polymorphic_value
要解决的问题(它赋予多态对象价值语义)。
polymorphic_value<T>
可以拥有并执行从T
派生的对象的深层副本。
ISO C ++提案在http://wg21.link/p0201
参考实施在这里https://github.com/jbcoe/polymorphic_value
我是论文和参考实现的作者。
我发现polymorphic_value可用于删除大量难以编写的样板代码。我有兴趣知道它是否也解决了你的问题。