參考資料:
Friend class的控制權其實在乙方,乙方必須有定義friend class的名稱,甲方再設計同名的friend class,以及與乙方相同的namespace,才能存取乙方的private和protected成員
如果乙方沒有定義friend class,甲方還是有可能可以存取乙方的protected成員(private看來是無法),而且不用是相同namespace,原理是搭配繼承使用,範例如下:
//乙方
namespace ThirdNamespace
{
class ThirdClass
{
protected:
static void DoSomething();
};
}
//甲方
namespace MyNamespace
{
class MyClass
{
protected:
class ThirdExt: public ThirdClass
{
friend class MyClass;
};
public: //protected/private
static void CallThirdProtected()
{
ThirdExt::DoSomething(); //存取乙方的protected成員
}
};
}
如此能保有一些商業生意上的彈性,譬如public是屬於免費版/測試版的功能,protected是屬於付費版/註冊版的功能,區分給不同客戶使用(private僅供自己內部使用)
另外,另外,另外,只要乙方把class設為密封型,如
class ThirdClass final
甲方就沒辦法繼承了,如此也沒辦法存取乙方的protected成員