參考資料:
https://stackoverflow.com/questions/3843711/friend-classes-across-different-namespaces-is-that-possible

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成員

創作者介紹
創作者 GNAySolution 的頭像
Yang

GNAySolution

Yang 發表在 痞客邦 留言(0) 人氣( 1 )