【问题标题】:C++ polymorphism Storing Base Class pointer in a vectorC ++多态性将基类指针存储在向量中
【发布时间】:2018-01-02 13:37:09
【问题描述】:

我有一个基类,然后是它的两个派生类。我正在使用基类的指针将派生类对象存储在 Vector 中。现在我必须打印存储在向量中的数据

如何从向量中检索对象。

如何确定检索到的对象属于哪个派生类。

    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 main() {

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

【问题讨论】:

  • 我也尝试过通过 members[i]->getType() 访问,但没有任何反应

标签: c++11 pointers vector polymorphism


【解决方案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;
}

【讨论】:

  • 但是您是否阅读了其余的答案?如果我的答案中有任何不清楚的地方,请随时提问
  • 请注意我更改了vector 成员;向矢量 成员;
  • 为什么我不能用 mbr->getWicketsTaken() 检索派生类的成员,例如 CricketPlayer 的成员,它是我的 CricketPlayer 派生类的 getter。
  • getter 是 public 还是 protected
  • getter 是公开的,但成员是受保护的
猜你喜欢
  • 1970-01-01
  • 2013-03-28
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
相关资源
最近更新 更多