【发布时间】:2011-04-26 00:51:54
【问题描述】:
我已经定义了一个 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 *'
我的问题(所有相关):
- 叶类如何解决
Cloneable的要求 界面? - 是否有更好的解决方案来实施 克隆合约,其中所有对象 保证实现克隆?
我将此范例用作通用编程(记录、字段和数据库)的一部分。
编译器:MS Visual Studio 2008;平台:Windows XP 和 Vista
【问题讨论】:
-
我使用了相同的编译器,一切编译正常。这是一个错误,已从 VC6 开始解决。
-
有些事情你没有告诉我们,因为这段代码在 VS 2008 中对我来说编译得很好。
-
真正的问题是为什么需要克隆一个对象。我从 Java 转换中看到了很多(这是一个大问题/概念),但我还没有看到 C++ 代码的需求。对你实际想要达到的目标的解释可能会给你一些关于 c++ 技术的好建议,
-
@Martin York:我发现这在创建动态语言工具(如解释器)时尤其常见,以满足对可以动态调用的复制构造函数的需求。我还没有找到它的任何其他有效用途,但这并不意味着它不存在。我更愿意让人们从怀疑中受益,尽管它可能总是会进行干预。
标签: c++ clone multiple-inheritance generic-programming cloneable