友元关系不能被继承。即一个函数是父类的友元函数,但不是子类的友元函数。也就是说父类的友元不能访问子类的私有和保护成员
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;
}