簡體   English   中英

包含指向多態類的指針的向量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM