前言
在之前的基础讲解中,我们梳理了继承的基本概念和默认成员函数。但在实际开发中,友元、静态成员、菱形继承这些特殊场景往往是理解'继承'机制的难点。这篇文章将逐一拆解这些场景的底层逻辑,帮你彻底掌握继承的隐藏规则。
一. 友元 —— 友元关系不可继承
C++ 中有一个常见的误区:认为基类的友元函数或类能自动访问派生类的私有成员。事实并非如此,友元关系不具有继承性。这就像'你父亲的朋友,不等同就是你的朋友'。
如果需要让友元访问派生类成员,必须在派生类中重新声明友元。
常见错误写法
#include <iostream>
#include <string>
using namespace std;
// 友元——友元不能被继承
class Person {
public:
friend void Display(const Person& p, const Student& s);
protected:
string _name = "张三"; // 姓名
};
class Student : public Person {
protected:
int _stuid = 123; // 学号
};
void Display(const Person& p, const Student& s) {
cout << p._name << endl;
cout << s._stuid << endl;
}
int main() {
Person p;
Student s;
Display(p, s);
return 0;
}
运行这段代码通常会遇到两个报错。第一个是关于类型未定义的,这是因为编译器在处理友元函数时向上查找 Student 类型,但此时还没定义。解决方法是在最开始前置声明 。






