我有一个父班和几个子班。 我想要一个父实例,并根据特定的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()
函数添加到父类中?
答案 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
(如果正常结束,通常为零)。