不能。友元函數只能訪問授予友元的類(及其基類)的所有成員(public/protected/private),無法訪問派生類新增的私有/保護成員。
class Base {
friend void func(Base&, Derived&);
int basePri = 1;
protected:
int basePro = 2;
public:
int basePub = 3;
};
class Derived : public Base {
int derivedPri = 10;
protected:
int derivedPro = 20;
public:
int derivedPub = 30;
};
void func(Base &b, Derived &d) {
cout << b.basePri; // OK
cout << b.basePro; // OK
cout << b.basePub; // OK
// cout << d.derivedPri; // 編譯錯誤:derivedPri 是 Derived 私有
// cout << d.derivedPro; // 編譯錯誤:derivedPro 是 Derived 保護
cout << d.derivedPub; // OK
}
牢記「友元不傳遞、不繼承」,即可在設計類之間訪問關係時不再踩坑。