//---(一)友元關係----------
友元關係不可繼承,base是基類,derive是派生類,f是base的友元, 這麼說來, "f不能訪問derive的private成員"是無誤的;
但是還是不夠準確,假設base有乙個privata的virtual函式func(),derive繼承並重寫了此函式,那麼在基類的友元f中有如下**:
看似f通過base*指標繞過了檢查, 並由虛函式表找到了derive::func(), 是不是想到了"友元破壞封裝"這句話?
與其把友元看作"破壞封裝"的罪魁禍首, 不如把這種機制稱為"基類的對外介面", 只要基類提供了這樣乙個介面:通過此介面我們可以間接訪問基類的私有成員, 這個"介面"可以是乙個public函式,也可以是一種"友元關係", 正是通過這個"友元關係"介面, 派生類中的私有成員可以被間接訪問了;
//---(二)private繼承----------
以上方式3中的p4指標仍可正常訪問virtual table內的函式;
C 繼承 友元 許可權
1,c 類的繼承分 public protected private三種 基類的成員 public protected private 被public繼承後 public protected private 被protected繼承後 protected protected private 被pri...
友元關係可以繼承 友元不能繼承
看這一段 struct顯然是編譯不過的,原因如題 友元關係不能繼承。但考慮這麼乙個情景 你想構建任意多的擴充套件去豐富b的功能,而這些擴充套件要用到b的一些非公開方法。既然是非公開,那就得友元了,但是擴充套件的類名你又不知道。最直觀的想法就是建立乙個擴充套件基類a,a是已知的,可以讓a成為b的友元。...
c 筆記 友元
類可以允許其他類或者函式訪問它的非公有成員,方法是令其他類或者函式成為它的友元。如果類想把乙個函式作為它的友元,只需要增加一條以friend關鍵字開始的函式宣告語句即可 class data data介面的非成員組成部分的宣告 data add std istream read 友元宣告只能出現在類...