如何克隆多个继承对象?

时间:2010-10-15 16:12:03

标签: c++ clone multiple-inheritance generic-programming cloneable

我已经定义了一个Cloneable接口:

struct Cloneable
{
  virtual Cloneable * clone(void) const = 0;
}

我还有一些其他接口类(与问题无关的内容):

struct Interface
{
};

struct Useful_Goodies
{
};

我创建了一个继承自上述类的叶子对象:

struct Leaf : public Cloneable, public Interface, public Useful_Goodies
{
  Leaf * clone(void) const  // Line #1 for discussion.
  {
     return new Leaf(*this);
  }
};

我收到了错误:

overriding virtual function return type differs and is not covariant from 'Cloneable::clone'

如果我将类型更改为Cloneable *,则会收到以下错误消息:

'return' : ambiguous conversions from 'Leaf *' to 'Cloneable *'

我的问题(全部相关):

  1. 叶子类如何解决 Cloneable的要求 接口
  2. 是否有更好的解决方案来实施 克隆合同,所有对象所在的位置 保证实施克隆?
  3. 我正在使用这个范例作为通用编程(记录,字段和数据库)的一部分。

    编译器:MS Visual Studio 2008;平台:Windows XP& Vista的

3 个答案:

答案 0 :(得分:2)

clone函数返回Cloneable *是正确的。

如果您的某个界面也来自Cloneable,您将获得不明确的转化。

修改:Alf在评论中指出Leaf::clone不仅可以返回Leaf*,实际上它更适合这样做。我有所纠正。

答案 1 :(得分:1)

您可能没有提到Interface或其他一些基类也继承Cloneable。 “模糊转换”意味着Leaf可能包含多个Cloneable基类子对象。 (协变返回类型的问题可能是同一问题的直接结果。)

您需要使用virtual inheritance解决此问题(推荐和链接阅读:C ++ FAQ Lite主题25.8到25.13)。首先,将: public Cloneable的所有实例更改为: public virtual Cloneable

答案 2 :(得分:1)

我可以冒险说你可能从多个路径中实际上从Cloneable继承。也就是说,直接Cloneable之外的其他一些基础(直接或间接)从Cloneable继承。这使得从Leaf*Cloneable*的转换不明确,因为Cloneable中有多个Leaf基数。

简单的解决方案是使用界面中的虚拟继承:

struct Cloneable {
   virtual Cloneable * clone() = 0;
};
struct Interface : virtual Cloneable {
};
struct Test : virtual Cloneable, Interface {
   virtual Test* clone() {
      return new Test(*this);
   }
};

虚拟继承意味着即使InterfaceTest都继承自Cloneable,也只有一个Cloneable基础对象。

相关问题