我最近问了一个有关使用cout方法从父类访问子成员的问题。但是这一次,如果我想使用get方法而不是cout怎么办?这会改变主意吗?
假设我有一个叫做CArray的类:

class CArray
{
 public:
  CArray();

 private:
  std::vector<CPerson *>Persons;
};
如果CPerson是父类:
class CPerson
{
public:
  CPerson();
  virtual void Print()
    {
        std::cout << Name << "\n";
    }

protected:
  std::string Name;
};
和Ctudent Person的 child
class CStudent : public CPerson
{
public:
  CStudent();

private:
  int MatriculationNr;
};
假设我们按如下方式加载CStudent和CPerson的私有(private)成员:
if (condition)
  {
    CStudent *S1 = new CStudent();
    S1->load(src); //Load function is missing in class but ignore it
    Persons.push_back(S1);
  }
我最近学习了如何使用虚拟方法以及如何通过在CStudent class中添加以下函数来访问CStudent和CPerson的私有(private)成员:
void Print()
    {
        CPerson::Print();
        std::cout << MatriculationNr << "\n";
    }
现在进入我的类CArray。我写了一个打印方法来打印Persons的元素:
我只需要编写Persons[i]->Print();即可从所有Persons中调用Print()。
现在的问题是,如果我想从Persons的第一个元素中获取MatriculationNr(作为示例)?cout << Persons[i]->getMatrikulNr();无效,因为我们在这里尝试从子类中获取函数,而这种方法是不可能的。
我想应用与print()相同的行为,但是由于get方法将具有return参数,所以这是不可能的。

最佳答案


您将无法。无论如何,都没有显示的代码。 MatriculationNr仅存在于CStudent中,并且它是private,因此只有CStudent可以访问它。

您将必须:

  • getMatrikulNr()添加一个公共(public)虚拟CPerson方法,然后CStudent可以覆盖该方法,例如:
    class CPerson
    {
    public:
       ...
       virtual int getMatrikulNr() const
         {
             return 0;
         }
       ...
    };
    
    class CStudent : public CPerson
    {
    public:
       ...
       int getMatrikulNr() const override
         {
             return MatriculationNr;
         }
    
    private:
       int MatriculationNr;
    };
    
    然后,您可以根据需要使用Persons[i]->getMatrikulNr()
  • getMatrikulNr()添加一个公共(public)CStudent方法,然后对每个dynamic_cast指针CPerson*进行查看,看它是否指向CStudent对象,例如:
    class CStudent : public CPerson
    {
    public:
       ...
       int getMatrikulNr() const
         {
             return MatriculationNr;
         }
    
    private:
       int MatriculationNr;
    };
    
    CStudent *student = dynamic_cast<CStudent*>(Persons[i]);
    if (student) {
         // use student->getMatrikulNr() as needed...
    }
    
  • 10-08 01:52