在上一篇文章中我们梳理了继承的基础概念和默认成员函数,但真正深入 C++ 面向对象设计时,友元、静态成员、菱形继承这些特殊场景往往是理解'继承'机制的难点。它们涉及到底层内存布局、访问权限控制以及构造顺序等核心细节。今天我们就把这些隐藏规则彻底讲透。
一、友元关系不可继承
很多初学者会误以为基类的友元自动拥有派生类的访问权,其实不然。C++ 规定,基类的友元无法直接访问派生类的私有或保护成员。这就像你父亲的朋友并不自动成为你的朋友一样,友元关系不具备继承性。
1. 常见错误写法
如果你尝试让一个只声明为基类友元的函数去访问派生类的私有成员,编译器会报错。这里还有一个容易被忽视的前置声明问题:
#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;
}
void Test1() {
Person p;
Student s;
Display(p, s);
}
int main() {
();
;
}


