是否可以为所有 child 类 设置一个实例?

Is it possible to have one instance for all child classes?

我有一个 parent class 和几个 child class。 我想要一个 parent 实例并根据特定 ID 对其进行实例化。 Child classes 可能具有 parent class 中没有的功能,我似乎无法访问它们。

class ParentInterface {
public:

   int gettemp();
};

class child1: public ParentInterface{
public:
    child1();
    virtual ~child1();
    int gettemp();  
    int getrand();

 };  

class child2: public ParentInterface{ 
public:
    child2();
    virtual ~child2();
    int gettemp();  

};

主要我想按如下方式使用它:

int main(int argc, char** argv) {

    int id = 1;
    ParentInterface *c;

    if(id == 1) c = new child1();

    if(id == 2) c = new child2();

    cout << "print temp: " << c->gettemp() << endl;

    cout << "print rand: " << c->getrand() << endl;

}

我无法从第一个 child 访问 getrand() 函数。我知道 c 被声明为 parent 但是有没有办法解决这个问题而不必将 getrand() 函数添加到 parent class?

您需要使用 dynamic_castc 转换为它的真实面目(child1)。

例如:

dynamic_cast<child1*>(c)->getrand();

如果不能保证是child1,你需要检查dynamic_cast是否成功:

child1 * child = dynamic_cast<child1*>(c);
if(child != nullptr) // if it succeeded
{
    child->getrand();
}

但是正如 @VTT 注意到的,您的 parent class 不是多态的。要使其工作,您必须在 parent class.
中将 gettemp() 声明为 virtual 这将使您的 parent class 成为多态的,因此,当您通过 parent class(实际上是 child 调用此方法时,child 方法将被调用。


编辑:

顺便说一下,您的程序正在泄漏内存。您总是必须释放动态分配的内存 (new --> delete / new [] --> delete []).
此外,您的 main() 函数应该 return 一个 int (如果它正常结束,通常为零)。