1

如果我有一个名为“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 根本不在列表中,或者列表中可能有 3 个 B 和 1 个 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 语句。

那么我该怎么做呢?

谢谢。

4

1 回答 1

0

一个常见的 C++ 解决方案是所谓的虚拟构造函数习语:您定义一个clone在基类中调用的虚函数A,然后将其覆盖B以返回一个新的实例,B并在C返回一个新的实例C

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

于 2012-06-20T17:35:24.707 回答