如何克隆多个继承对象?
-
08-10-2019 - |
题
我已经定义了一个可包隆的界面:
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 *'
我的问题(全部相关):
- 叶类如何解决
Cloneable
界面? - 是否有更好的解决方案来实施克隆合同,其中所有对象都可以保证实施克隆?
我正在使用此范式作为通用编程(记录,字段和数据库)的一部分。
编译器: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);
}
};
虚拟继承意味着即使 Interface
和 Test
继承 Cloneable
, ,只有一个 Cloneable
基本对象。