C++ 继承的隐蔽角落:友元、静态成员与菱形继承
继承基础我们已经聊过了,接下来看看几个容易混淆的场景:友元、静态成员和菱形继承。这些地方理解不到位,写出来的代码就可能带着不易察觉的 bug。
友元关系不可继承
基类的友元不能自动访问派生类的私有或保护成员。可以类比:你父亲的朋友天然不是你的朋友,得你亲自声明才算。所以如果想让某个友元函数同时处理基类和派生类的私有数据,必须在派生类里再声明一次。
先看一段有问题的代码:
#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() {
Test1();
return 0;
}
编译会报两个错。第一个是因为 Display 的参数里出现了 Student,但此时编译器还没看到 的定义,需要前置声明。第二个才真正点题:基类友元管不到派生类的私有成员。


