我有一个基类A,类B和C都是从它派生的。 A是一个抽象类,所有三个类都有一个带有2个参数的构造函数。是否可以像这样在基类A中创建一个方法:
A* clone() const
{
return new this.GetType(value1, value2);
}
如果调用clone() - 函数的当前对象是例如C,该函数将返回指向类类型C的新对象的指针?
答案 0 :(得分:2)
您需要将clone()
作为虚拟函数并在类C
中覆盖它,如下所示:
class A
{
public:
virtual A* clone() const { return new A(v1, v2); }
}
class C : public A
{
public:
virtual A* clone() const { return new C(v1, v2); }
}
答案 1 :(得分:2)
这看起来像C ++ .NET(a.k.a。“托管C ++”)而不是普通(标准)C ++。我不是这方面的专家,但我的猜测(假设是.NET)将是你必须使用反射来实例化System.Type
的对象。通常的步骤是:
Type
对象,例如致电GetType
。ConstructorInfo
(Type.GetConstructors()
IIRC)ConstructorInfo.Invoke()
创建实例System.Object
投射到所需类型。在常规C ++中,根本不能这样做,因为语言根本就没有反射,并且类型信息在运行时大部分丢失(RTTI可以比较和测试对象的运行时类型,但那是关于它)。您必须为每个派生类实现一个新的克隆方法;我通常使用的模式看起来像这样:
class Foobar : public Baz {
public:
int extra; // public for demonstration purposes
// Copy constructor takes care of actual copying
Foobar(const Foobar& rhs) : Baz(rhs), extra(rhs.extra) { }
// clone() uses copy constructor to create identical instance.
// Note that the return type is Baz*, not Foobar*, so that inheritance works
// as expected.
virtual Baz* clone() const { return new Foobar(*this); }
};
答案 2 :(得分:1)
使clone()
为虚拟,并让子类B和C实现自己的clone()
版本并返回自己的新实例。
答案 3 :(得分:1)
其他答案没有什么特别的错误,但如果我假设A的所有子类只能通过构造两个参数来clone()
,那么我就这样做:
class A
{
public:
A* clone() const { return create(value1, value2); }
private:
virtual A* create(Type1 v1, Type2 v2) const { return new A(v1, v2); }
};
class C : public A
{
virtual C* create(Type1 v1, Type2 v2) const { return new C(v1, v2); }
};
如果不出意外,这意味着不需要在C类中访问value1
和value2
- 他们可能是私人成员。如果它们是非平凡的表达式,则它们也不需要在C中重复。
但这有点可疑的假设 - 更有可能你希望clone()
使用派生类的复制构造函数,就像在tdammers的答案中那样。