2010-10-21 181 views
0

我有一个基类A,而类B和C是从它派生的。 A是一个抽象类,所有三个类都有一个构造函数,它需要2个参数。是否有可能作出这样的基类中的方法:在基类中使用“new this.GetType()”来实例化派生类

A* clone() const 
{ 
    return new this.GetType(value1, value2); 
} 

如果当前对象,其克隆() - 函数被调用是例如C,该函数将返回指向一个新的类类型C的对象?

+1

这是托管C++吗?我们的回应是针对标准C++,尽管tdammers也讨论了托管部分。 – birryree 2010-10-22 00:33:51

+0

正常的C++,谢谢你所有的答案:) – Moberg 2010-10-22 09:10:58

回答

2

这看起来像C++。NET(又名 “托管C++”),而不是普通的(标准)C++。我不是这方面的专家,但我的猜测(假设.NET)会是你必须使用反射来实例化一个System.Type的对象。通常的步骤是:

  1. 创建或获取适当的Type对象,例如,通过致电GetType
  2. 查找合适ConstructorInfoType.GetConstructors() IIRC)
  3. 呼叫ConstructorInfo.Invoke()来创建实例
  4. 铸造所得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); } 
}; 
+0

相反如何做出任何意义呢? – tdammers 2010-10-22 09:18:09

1

使clone()虚拟并使子类B和C实现它们自己的版本clone()并返回它们自己的新实例。

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

没有什么特别不妥其他的答案,但如果我假设的所有子类可以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); } 
}; 

如果不出意外,这意味着value1value2并不需要在C级访问 - 他们可能是私有成员。如果它们是不重要的表达式,那么它们也不需要在C中重复。

虽然这有点可疑,但更可能的是,您希望clone()使用派生类的复制构造函数,就像在tdammers的答案中一样。

相关问题