【C++】——继承(下)-5 继承与友元

时间:2024-10-12 18:29:08

  友元关系不能被继承。即一个函数是父类的友元函数,但不是子类的友元函数。也就是说父类的友元不能访问子类的私有和保护成员

class Person
{
public :
	friend void Display(const Person& p, const Student& s);
protected:
	string _name; // 姓名
};
class Student : public Person
{

protected :
	int _stuNum; // 学号
};

void Display(const Person& p, const Student& s)
{
	cout << p._name << endl;
	cout << s._stuNum << endl;
}


int main()
{
	Person p;
	Student s;

	Display(p, s);
	return 0;
}

在这里插入图片描述

  这里出现了许多报错,但没关系,我们先看框出来的这一条
  这条报错说缺少",",一般出现这种报错,而我们检查出并没有","的相关问题时,通常都是 类型出问题了,一般是我们没有定义某个类型但我们直接去使用就会出现这种报错
  编译器遇到一个类型、变量、函数时都只会向上查找,这是为了提高编译速度
  出现报错的原因是friend void Display(const Person& p, const Student& s);中我们使用了 S t u d e n t Student Student 类型,它的定义在下面。但 S t u d e n t Student Student P e r s o n Person Person 的继承,又不可能将其放在 P e r s o n Person Person 的前面,我们可以在 P e r s o n Person Person 前加上 S t u d e n t Student Student前置声明

class Student;

  
  解决这个问题后报错就少很多啦,我们再看看剩下的报错

在这里插入图片描述

  这里就是友元函数的问题啦。 D i s p l a y ( ) Display() Display() P e r s o n Person Person 的友元,但友元关系不能继承下来,因此 D i s p l a y ( ) Display() Display() 不是 S t u d e n t Student Student 的友元。解决方法也很简单, S t u d e n t Student Student 中加一个有元声明就好

//前置声明
class Student;

class Person
{
public :
	friend void Display(const Person& p, const Student& s);
protected:
	string _name; // 姓名
};
class Student : public Person
{
public:
	friend void Display(const Person& p, const Student& s);
protected :
	int _stuNum; // 学号
};

void Display(const Person& p, const Student& s)
{
	cout << p._name << endl;
	cout << s._stuNum << endl;
}