我已经定义了一个可包隆的界面:

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. 是否有更好的解决方案来实施克隆合同,其中所有对象都可以保证实施克隆?

我正在使用此范式作为通用编程(记录,字段和数据库)的一部分。

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

有帮助吗?

解决方案

有你的 clone 功能返回 Cloneable * 是正确的。

如果您的一个接口之一也来自 Cloneable.

编辑: ALF在评论中指出,不仅有可能 Leaf::clone 返回 Leaf*, ,实际上最好是这样做。我站立了。

其他提示

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

您需要使用 虚拟继承 (推荐和链接的阅读:C ++常见问题解答LITE主题25.8至25.13)。首先,更改 全部 实例 : public Cloneable: public virtual Cloneable.

我可以冒险,说你可能不是实际上是从 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 基本对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top