2017-07-27 82 views
0

我有一个基类,然后是它的两个派生类。我正在使用基类的指针来存储Vector中的派生类对象。现在我要打印存储在矢量C++多态性在一个向量中存储基类指针

我怎么能检索的矢量对象中的数据。

我怎样才能确保到派生类检索的对象所属。

class CricketPlayer:public SlumsMember 
{ 
    protected: 
     int runsScored; 
     int wicketsTaken; 
     int catchesTaken; 
    public: 
     CricketPlayer(int rNo,string n,double theGpa,char typ,int rScore,int theWicketTaken,int theCatchTaken); 
     int getRunsScored(); 
     int getWicketsTaken(); 
     int getCatchesTaken(); 

}; 

    CricketPlayer::CricketPlayer(int rNo,string n,double theGpa,char typ,int rScore,int theWicketTaken,int theCatchTaken): 
        SlumsMember(rNo,n,theGpa,typ) 
        { 
         runsScored=rScore; 
         wicketsTaken=theWicketTaken; 
         catchesTaken=theCatchTaken; 
        } 



    int CricketPlayer::getRunsScored() 
    { 
     return (runsScored); 

    } 
    int CricketPlayer::getWicketsTaken() 
    { 
     return (wicketsTaken); 
    } 
    int CricketPlayer::getCatchesTaken() 
    { 
     return(catchesTaken); 
    } 

class FootballPlayer:public SlumsMember 
{ 
protected: 
    int goalsScored; 
    int assists; 
    int interceptions; 
public: 

    FootballPlayer(int rNo,string n,double theGpa,char typ,int theGoalsScored,int theAssists,int theInterceptions); 
    int getGoalsScored(); 
    int getAssists(); 
    int getInterceptions(); 

}; 

    FootballPlayer::FootballPlayer(int rNo,string n,double theGpa,char typ,int theGoalsScored,int theAssists,int theInterceptions): 
        SlumsMember(rNo,n,theGpa,typ) 
        { 
          goalsScored=theGoalsScored; 
          assists=theAssists; 
          interceptions=theInterceptions; 
        } 

    int FootballPlayer::getGoalsScored() 
    { 
      return(goalsScored); 

    } 
    int FootballPlayer::getAssists() 
    { 
     return(assists); 

    } 
    int FootballPlayer::getInterceptions() 
    { 
      return(interceptions); 
    } 

这里我使用向量来存储载体中的对象。

INT主要(){

vector<SlumsMember> members; 

SlumsMember *slumsMember; 

        slumsMember=new FootballPlayer(rNo,name,gpa,ch,a,b,c); 


        slumsMember=new CricketPlayer(rNo,name,gpa,ch,a,b,c); 





      members.push_back(*slumsMember); 

SlumsMember *mbr; 
for(int i=0;i<members.size();i++) 
{ 
    mbr=members[i]; 

    //How to make sure to which base class an object retrieved belongs to and how to access it. 

}  







return 0; 
} 
+0

我已经试过甚至通过会员访问[我] - > getType()以及但没有任何发生 – ProgrammingNinja

回答

1

我清理你的代码有点...

class SlumsMember 
{ 

试试这个...使基类中的getWicketsTaken功能虚拟

public: 
    virtual int getWicketsTaken(); 

    int rollNumber; 
    string name; 
    double gpa; 
    char type; 
}; 



class CricketPlayer:public SlumsMember 
{ 
public: 

覆盖可以帮助防止类型过载

int getWicketsTaken() override; 

    int runsScored; 
    int wicketsTaken; 
    int catchesTaken; 
}; 



class FootballPlayer: public SlumsMember 
{ 
Then you can override the getWicketsTaken in this class too 

int getWicketsTaken() override; 

public: 
    int goalsScored; 
    int assists; 
    int interceptions; 
}; 

int main() { 
    vector<SlumsMember*> members; 

请注意,下一行,你应该,如果你给它的价值不是一个类型slumsmember的收到一个编译器错误。

members.push_back(new FootballPlayer(rNo,name,gpa,ch,a,b,c)); 
    members.push_back(new CricketPlayer(rNo,name,gpa,ch,a,b,c)); 

    SlumsMember *mbr; 
    for(int i=0;i<members.size();i++) 
    { 
     mbr=members[i]; 
     //How to make sure to which base class an object retrieved belongs to and how to access it. 
     int rollNumber = mbr->rollNumber; 
     double gpa = mbr->gpa; 

等等,不要忘记在某个时刻释放在年底你的对象,这样你就不会得到内存泄漏

 } 

    return 0; 
} 
+0

我已经有getter和setter只是没有发布它们。 – ProgrammingNinja

+0

但你读过答案的其余部分吗?随意提问,如果我的回答有什么不太明白 –

+0

请注意,我改变 矢量成员; 至 vector 成员; –