前往
大廳
主題

C++的friend class,嘗試存取不同namespace的protected內容

Yang | 2024-03-03 07:28:34 | 巴幣 0 | 人氣 53

參考資料:

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成員
送禮物贊助創作者 !
0
留言

創作回應

更多創作