在基类中使用“new this.GetType()”来实例化派生类

时间:2010-10-21 23:57:36

标签: c++ class polymorphism

我有一个基类A,类B和C都是从它派生的。 A是一个抽象类,所有三个类都有一个带有2个参数的构造函数。是否可以像这样在基类A中创建一个方法:

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

如果调用clone() - 函数的当前对象是例如C,该函数将返回指向类类型C的新对象的指针?

4 个答案:

答案 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的对象。通常的步骤是:

  1. 创建或获取合适的Type对象,例如致电GetType
  2. 找到合适的ConstructorInfoType.GetConstructors() IIRC)
  3. 致电ConstructorInfo.Invoke()创建实例
  4. 将生成的System.Object投射到所需类型。
  5. 在常规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类中访问value1value2 - 他们可能是私人成员。如果它们是非平凡的表达式,则它们也不需要在C中重复。

但这有点可疑的假设 - 更有可能你希望clone()使用派生类的复制构造函数,就像在tdammers的答案中那样。