![](/img/trans.png)
[英]Access child class functions from a vector of a parent class without downcasting
[英]Access specific child class functions whose objects are in a template class vector
我是新来的,希望您能帮助我! :)
我的问题如下:
首先,我有这个类图:
另外,我还有另一个类Rocket
,它的vector
应包含所有火箭零件作为生成的指针。 我的问题是Rocket
类包含3种计算方法,例如:
template<typename T>
double Rocket<T>::calcTWR(){
double thrust = 0;
for (int i = 0; i < m_parts.size();i++){
thrust += m_parts[i]->getThrust();
}
return thrust;
}
是的,我使用了模板,因为我不确定如何处理所有这些子类,因此我认为模板可能适合此处。 另外,这就是问题所在,调用rocket.calcTWR();
似乎不起作用rocket.calcTWR();
可以解决:编译器说
getThrust()不是'RocketPart'的成员
我很了解,但是如何解决呢? 如何在Rocket
中声明一个向量,该向量能够包含RocketPart
所有子类,并且在main
RocketPart
中,我如何调用calcTWR()
,以便无论vector
的内容如何,它实际上都会返回总thrust
?
请保持简单,我仍然是初学者! ;)
我假设m_parts
是指向通用基类的指针的向量?
然后,您需要下调至正确的课程,例如
static_cast<ActualClassThisIs*>(m_parts[i])->getThrust();
请注意,这仅在类从基类继承时才有效。 另请注意,如果实际的类不是您要强制转换的类,则它将不起作用。 然后,您可能必须使用dynamic_cast
并检查nullptr
:
if (dynamic_cast<ActualClassThisIs*>(m_parts[i]) != nullptr)
dynamic_cast<ActualClassThisIs*>(m_parts[i])->getThrust();
最后一部分
如何在Rocket中声明一个向量,该向量能够包含RocketPart的所有子类,并且在主要方面,我如何调用calcTWR(),以便无论向量的内容如何,它实际上都可以返回总推力?
可以通过以下方式完成操作:
class IPart {
virtual double getThrust() = 0;
}
class MetalPart : public IPart {
double getThrust() override { return 5.5; }
}
class PlasticPart : public IPart {
double getThrust() override { return 3.3; }
}
class CrappyPart : public IPart {
double getThrust() override { return 1.1; }
}
然后将它们放在一个
std::vector<IPart*> parts;
然后可以使用以下方法计算总推力:
double total = 0;
for(auto part : parts) {
total += part->getThrust();
}
抱歉,您的图表在我的屏幕上不可读,所以我做了一些名字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.