代码之家  ›  专栏  ›  技术社区  ›  int3

初始化未知子类的模式

  •  0
  • int3  · 技术社区  · 15 年前

    我正在尝试创建这样的函数f:

    StorageObject::addItem (const AbstractBase& base) {
        AbstractBase* storage = new Derived1(base);
    }
    

    但是,我希望f也能处理派生的类2、派生的类3等。有没有一种方法可以让f调用正确的构造函数,这取决于传递给它的abstractBase的特定子类,而不使用类型代码?

    为了将问题放到上下文中,我使用这个函数初始化类中的对象列表。我可以做些像

    Derived1* temp = new Derived1();
    storageobject.addItem(*temp);
    delete temp;
    

    我更喜欢做像

    storageobject.addItem(Derived1());
    

    让StorageObject处理一切。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Stefan Steinegger    15 年前

    为什么不实现一个虚拟复制方法呢?

    AbstractBase* storage = base.Copy()
    

    顺便说一下,这是非常具体的C++,因为使用C可以简单地通过反射来实现。

    Activiator.CreateInstance(temp.GetType(), temp);
    

    当然,周围有一些不错的工厂模式,但这确实取决于您需要解决的具体问题。

        2
  •  0
  •   Dewfy    15 年前
    • 如果可以使用模板。
    • 如果语言中没有模板,请使用抽象工厂模式