创建派生类的新实例,不知道它的类型

时间:2012-06-20 17:29:33

标签: instance base derived-class base-class derived

如果我有一个名为“A”的类,并且我有两个派生自它的类,请说“B”和“C”如何创建B和C的新实例,而不知道哪个是哪个。这可能听起来令人困惑,所以让我澄清并使用与我相似的代码。

基类:

class A {
    stuff...
}

派生类:

class B : A{
    stuff...
}

class C : A {
    stuff...
}

然后在其他课程中我有:

class Z {
    void Derp() {
        foreach(A classA in listOfA's) {
            create new instance of derived class
        }
    }
}

我根本不能只说B = new B()C = new C()因为可能B根本不在列表中,或者列表中可能有三个B和一个A. Surly有一些方法可以做到,但如果没有,我可以有一个switch-case语句,如:

class Z {
    void Derp() {
        foreach(A classA in listOfA's) {
            switch(classA) {
                case is B:
                    B = new B();
                    break;
                case is C:
                    C = new C();
                    break;
                }
            }
        }
    }
}

除非必要,否则我想避免这样做,因为每次我创建一个派生自A类的新类时,我都必须记住在那里添加另一个case语句。

那我该怎么做呢?

感谢。

1 个答案:

答案 0 :(得分:0)

一个常见的C ++解决方案是所谓的virtual constructor idiom:你在基类clone中定义一个名为A的虚函数,然后在B中覆盖它}返回B的新实例并在C中返回C的新实例。

如果您需要空白实例而不是克隆,则可以添加使用默认构造函数的newInstance函数。