首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 友元函數訪問權限詳解:能否訪問派生類私有成員?

     編輯:程式設計疑難解答

直接回答

不能。友元函數只能訪問授予友元的類(及其基類)的所有成員(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
}

核心規則總結

  • 友元關係不傳遞、不繼承。
  • 類 A 的友元只能「看穿」類 A 的封裝,對類 A 的派生類 D,友元只能訪問 D 繼承自 A 的那部分成員(受 A 中訪問控制影響),D 自身聲明的私有/保護成員對 A 的友元不可見。
  • 若需讓外部函數訪問派生類私有成員,需在派生類中單獨聲明友元。

牢記「友元不傳遞、不繼承」,即可在設計類之間訪問關係時不再踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved