所有子类都可以有一个实例吗?

时间:2019-09-17 07:33:37

标签: c++ c++98

我有一个父班和几个子班。 我想要一个父实例,并根据特定的ID对其进行实例化。 子类可能具有不在父类中的函数,而且我似乎无法访问它们。

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;

}

我无法从第一个孩子访问getrand()函数。我知道c被声明为父类,但是有一种解决方法,而不必将getrand()函数添加到父类中?

1 个答案:

答案 0 :(得分:3)

您需要使用dynamic_cast来将c转换为实际值(child1)。

例如:

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

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

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

但是,正如 @VTT 所注意到的那样,您的父类不是多态的。要使其正常工作,必须在父类中将gettemp()声明为virtual
这将使您的父类具有多态性,因此,当您在实际上是孩子的父类上调用此方法时,将改为调用child方法。


编辑:

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