21 2 繼承與友元

2021-10-01 11:18:19 字數 1329 閱讀 9669

引入: 友元關係不能繼承,也就是說基類友元不能訪問子類私有和保護成員,在有些情況下會有基類友元不能訪問子類私有和保護成員這樣的需求.

於是就有如下實現方式 :

//繼承與友元example (1)

class student;

class person

;class student : public person

;void display(const person& p, const student& s)

void main()

以上**是無法編譯通過的

cout << s._stunum << endl; //error

這一句**會報錯 :   錯誤(活動) e0265 成員 「student::_stunum」 (已宣告 所在行數:361) 不可訪問

說明:  友元關係不能繼承,也就是說基類友元不能訪問子類私有和保護成員

解決辦法很簡單如下:

//繼承與友元 right example (1)

//繼承與友元 right example (2)

class student;

class person

;class student : public person

;void display(const person& p, const student& s)

void main()

只需要在派生類d中加上與基類友元函式的宣告就行

//繼承與友元 example (2)

class d;

class a

a(const a& a)

a& operator=(const a& a)

~a()

private:

int a_data = 1; //c++11

};class d : public a

~d()

private:

int d_data = 2;

};ostream& operator<<(ostream& out, const d& d)

void main()

以上只需要在派生類d中加上與基類友元函式的宣告就行

friend ostream& operator<<(ostream& out, const d& d);

友元關係可以繼承 友元不能繼承

看這一段 struct顯然是編譯不過的,原因如題 友元關係不能繼承。但考慮這麼乙個情景 你想構建任意多的擴充套件去豐富b的功能,而這些擴充套件要用到b的一些非公開方法。既然是非公開,那就得友元了,但是擴充套件的類名你又不知道。最直觀的想法就是建立乙個擴充套件基類a,a是已知的,可以讓a成為b的友元。...

c 友元關係與繼承

友元關係不能繼承。基類的友元對派生類的成員沒有特殊訪問許可權。如果基類被授予友元關係,則只有基類具有特殊訪問許可權,該基類的派生類不能訪問授予友元關係的類。class base frnd has no access to members in d1 class d1 public base clas...

友元類與友元函式的繼承與傳遞問題

c primer中有如下描述 友元關係不能被繼承,基類的友元對派生類沒有特殊的訪問許可權。然而通過實踐發現,vs編譯器並沒有安裝上述描述來處理,下面的規則與上述描述相悖,卻符合vs編譯器的處理規則。注 有待通過g 編譯器來驗證。1 友元類的繼承問題 1.1乙個友元類的派生類,可以通過其基類介面去訪問...