我有一个基类A,而类B和C是从它派生的。 A是一个抽象类,所有三个类都有一个构造函数,它需要2个参数。是否有可能作出这样的基类中的方法:在基类中使用“new this.GetType()”来实例化派生类
A* clone() const
{
return new this.GetType(value1, value2);
}
如果当前对象,其克隆() - 函数被调用是例如C,该函数将返回指向一个新的类类型C的对象?
我有一个基类A,而类B和C是从它派生的。 A是一个抽象类,所有三个类都有一个构造函数,它需要2个参数。是否有可能作出这样的基类中的方法:在基类中使用“new this.GetType()”来实例化派生类
A* clone() const
{
return new this.GetType(value1, value2);
}
如果当前对象,其克隆() - 函数被调用是例如C,该函数将返回指向一个新的类类型C的对象?
这看起来像C++。NET(又名 “托管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); }
};
相反如何做出任何意义呢? – tdammers 2010-10-22 09:18:09
使clone()
虚拟并使子类B和C实现它们自己的版本clone()
并返回它们自己的新实例。
你需要让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); }
}
没有什么特别不妥其他的答案,但如果我假设的所有子类可以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); }
};
如果不出意外,这意味着value1
和value2
并不需要在C级访问 - 他们可能是私有成员。如果它们是不重要的表达式,那么它们也不需要在C中重复。
虽然这有点可疑,但更可能的是,您希望clone()
使用派生类的复制构造函数,就像在tdammers的答案中一样。
这是托管C++吗?我们的回应是针对标准C++,尽管tdammers也讨论了托管部分。 – birryree 2010-10-22 00:33:51
正常的C++,谢谢你所有的答案:) – Moberg 2010-10-22 09:10:58