這是我在文件source.cpp代碼:基類的friend類如何通過派生於基類的類的對象訪問該基類的成員?
class B
{
friend class F;
protected:
int protectedIntB;
};
class D : public B {};
class F
{
public:
int f(D &d) {return ++d.protectedIntB;}
};
當我編譯以上g++ -c -Wall -pedantic -std=c++11 source.cpp
和cl /c source.cpp
碼,兩種編譯器編譯成功。然而,當我做d使用protected
代替public
的B繼承:
class D : protected B {};
這一次,GCC編譯成功,而CL給出了一個錯誤說B::protectedIntB
在return ++d.protectedIntB;
無法訪問。
另一種情況是用private
更換public
:
class D : private B {};
這一次,無論是編譯器產生的錯誤。順便說一下,我使用的是由VS2015的mingw-w64和cl版本19.00.24210構建的gcc版本5.3.0。
這裏我的問題是:
如何友元類是基類的基類成員的訪問,通過從基類派生的類的對象,爲什麼gcc和CL處理不同的看法?
編輯:
感謝songyuanyao和Brian,似乎在GCC 5.3.0在protected
情況下的錯誤。只有public
的情況下應該編譯成功,並且gcc 6.1.0也可以正常工作。