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

2021-07-09 16:39:12 字數 2566 閱讀 3659

【**:

c++ primer中有如下描述:友元關係不能被繼承,基類的友元對派生類沒有特殊的訪問許可權。

然而通過實踐發現,vs編譯器並沒有安裝上述描述來處理,下面的規則與上述描述相悖,卻符合vs編譯器的處理規則。

注:有待通過g++編譯器來驗證。

1 友元類的繼承問題

1.1乙個友元類的派生類,可以通過其基類介面去訪問設定其基類為友元類的類的私有成員,也就是說乙個類的友元類的派生類,某種意義上還是其友元類,這句話有點繞,上**就清晰了

示例**:

[cpp]view plain

copy

#include 

using

namespace

std;   

class

b;   

class

a   

friend

class

b;   

};   

class

b   

};   

class

c:public

b  ;   

void

main()   

1.2.乙個派生類的基類的友元類仍然是它的友元類

示例**如下:

[cpp]view plain

copy

#include 

using

namespace

std;   

class

b;   

class

a   

friend

class

b;   

};   

class

c:public

a     

//通過繼承,a的友員類b成了派生類c的友員類 

};  

class

b   

};   

void

main()   

2 友元函式的繼承問題

基類的友元函式仍然是派生類的友元函式

示例**:

[cpp]view plain

copy

#include 

using

namespace

std;    

class

b;  

class

a   

friend

void

fun(b&); 

//若注釋掉此句則無法通過編譯

virtual

~a(){} 

//用作基類的類皆新增乙個虛析構函式是乙個好習慣,無論析構函式是否真的需要

};   

class

b: public

a    

};  

void

fun(b& o)  

void

main()   

3 友元類的傳遞問題

乙個友元類b的友元類,對將b設定為友元類的類沒有特殊的訪問許可權

示例**如下:

[cpp]view plain

copy

#include 

using

namespace

std;   

class

a   

friend

class

b;   

};   

class

b   

friend

class

c;  

};  

class

c   

//此句無法通過編譯

};  

void

main()   

4 友元函式的傳遞問題

乙個友元類的友元函式對設定這個類為友元類的類沒有特殊訪問許可權

示例**如下:

[cpp]view plain

copy

#include 

using

namespace

std;   

class

a   

friend

class

b;   

};   

class

b   

friend

void

fun2(a& ob);  

};   

void

fun2(a& ob)  

void

main()   

友元函式與友元類 友元與巢狀

友元提供了不同類的成員函式之間 類的成員函式與一般函式之間進行資料共享的機制。通過友元,乙個不同函式或另乙個類中的成員函式可以訪問類中的私有成員和保護成員。c 中的友元為封裝隱藏這堵不透明的牆開了乙個小孔,外界可以通過這個小孔窺視內部的秘密。友元的正確使用能提高程式的執行效率,但同時也破壞了類的封裝...

友元函式與友元類

物件導向程式設計的乙個重要思想就是實現資料隱藏 類的封裝特性 即 非成員函式不能訪問private 或者 protected 變數。有些時候我們需要不經成員函式而訪問private 或者 protected資料,那就需要用到 友元函式 或者友元類。使用friend關鍵字在類內任意位置宣告函式為友元函...

友元函式與友元類

友元函式 需要友元的原因 1 普通函式需要直接訪問乙個類的保護或私有資料成員 2 需要友元的另乙個原因是為了方便過載操作符的使用 友元函式不是成員函式,它是類的朋友,因而能夠訪問類的全部成員 在類的內部,只能宣告它的函式原型,加上friend 關鍵字 優缺點 優點 能夠提高效率,表達簡單,清晰 缺點...