是否可以为所有 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_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 注意到的,您的 parent class 不是多态的。要使其工作,您必须在 parent class.
中将 gettemp()
声明为 virtual
这将使您的 parent class 成为多态的,因此,当您通过 parent class(实际上是 child 调用此方法时,child 方法将被调用。
编辑:
顺便说一下,您的程序正在泄漏内存。您总是必须释放动态分配的内存 (new
--> delete
/ new []
--> delete []
).
此外,您的 main()
函数应该 return 一个 int
(如果它正常结束,通常为零)。
我有一个 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_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 注意到的,您的 parent class 不是多态的。要使其工作,您必须在 parent class.
中将 gettemp()
声明为 virtual
这将使您的 parent class 成为多态的,因此,当您通过 parent class(实际上是 child 调用此方法时,child 方法将被调用。
编辑:
顺便说一下,您的程序正在泄漏内存。您总是必须释放动态分配的内存 (new
--> delete
/ new []
--> delete []
).
此外,您的 main()
函数应该 return 一个 int
(如果它正常结束,通常为零)。