在之前的基础讲解中,我们梳理了继承的核心概念。但实际开发中,友元、静态成员和菱形继承往往是理解上的深水区。这篇文章将逐一拆解这些特殊场景的底层逻辑,帮你彻底掌握继承的'隐藏规则'。
一、友元 —— 友元关系不可继承
C++ 中,基类的友元函数或类无法直接访问派生类的私有成员。这就像'你父亲的朋友,不等同就是你的朋友',友元关系不具有继承性。如果需要让友元访问派生类成员,必须在派生类中重新声明一下友元。
常见误区与修正
先看一个典型的错误写法。编译器报错往往很隐蔽,比如提示缺少逗号或者类型未定义。这是因为编译器在处理友元函数时向上查找 Student 类型,如果还没定义就会报错。虽然把 Student 放到 Person 上面能解决查找问题,但这会导致循环依赖(Student 又需要 Person)。
解决方法是在最开始前置声明 Student,并在派生类中再次声明友元。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 前置声明 Student(为了让编译器走到友元函数时能向上查找到 Student)
class Student;
class Person {
public:
friend void Display(const Person& p, const Student& s);
protected:
string _name = "张三"; // 姓名
};
class Student : public Person {
friend void Display(const Person& p, const Student& s); // 关键:在派生类也进行友元声明
protected:
int _stuid = 123;
};
{
cout << p._name << endl;
cout << s._stuid << endl;
}
{
Person p;
Student s;
(p, s);
}
{
();
;
}







