我最近问了一个有关使用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...
}