[英]vectors containing pointers to polymorphic classes
我在理解如何正确使用与多态类有关的指针向量方面遇到一些麻烦。 假设我有一个多态结构:
家长班
class Bumper {
protected:
double mu_;
public:
Bumper(){};
Bumper(double mu):mu_(fabs(mu)){};
void Set_mu(double mu){mu_=mu;};
virtual void Bounce (Ball & myB)const{myB.change_speed(-sqrt(mu_));};
};
儿童班
class ThresholdBumper : public Bumper {
protected:
double eps_;
public:
ThresholdBumper(double eps):Bumper(1.5), eps_(eps){};
virtual void Bounce (Ball & myB){
if(myB.energy()<eps_){Set_mu(1); Bumper::Bounce(myB); Set_mu(1.5); return;};
Bumper::Bounce(myB);
};
};
功能
void flipper (Ball & myB, vector<Bumper*> & Obst){
for(int i=Obst.size()-1; i>=0; i--){
Obst[i]->Bounce(myB);
};
};
change_speed()是一个void函数,用于更改Ball类中的私有参数,而energy()是一个标量函数。 这段代码:
vector<Bumper*> myBumpers1(10);
for(int i=0; i<10; i++){
myBumpers1[i]=new ThresholdBumper(drand48()*5);
};
flipper(myBalls2,myBumpers1);
不起作用,因为在“ flipper”函数中调用了Bumper :: Bounce()。 这意味着该函数似乎无法识别存在多态性。 有人可以解释我为什么吗? 特别地,将功能重新定义为:
功能'
void flipper(Ball & myB, vector<Bumper*>::iterator begin, vector<Bumper*>::iterator end){
vector<Bumper*>::iterator it;
for(it=end-1; it!=begin; --it){
(*it)->Bounce(myB);
};
};
使一切正常运行,如预期的那样。 到底有什么区别?
您的子类实际上声明了单独的Bounce
函数,而不是重写基类Bounce
。 注意,在基类中将其声明为const
。 您应该在子类中将其重新声明为
void Bounce (Ball & myB) const override {
override
关键字确保基类的虚函数被覆盖
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.