包含多态类指针的向量

时间:2017-04-15 14:51:10

标签: c++ vector iterator polymorphism

我有一些麻烦,了解如何正确使用与多态类相关的指针向量。 假设我有一个多态结构:

家长班

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);

不起作用,因为Bumper :: Bounce()在&#34;鳍状肢&#34;中被调用功能。这意味着该函数似乎无法识别存在多态性。有人能解释一下为什么吗?特别是,将函数重新定义为:

功能&#39;

 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);
    };
};

让一切顺利,正如预期的那样。有什么区别?

1 个答案:

答案 0 :(得分:2)

您的子类实际上声明了单独的Bounce函数,而不是覆盖基类Bounce。请注意,在基类中,它被声明为const。您应该在子类中重新声明它

void Bounce (Ball & myB) const override {

override关键字确保正在覆盖基类的虚函数