• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            chenglong7997

            用C++設(shè)計(jì)一個(gè)不能被繼承的類

            題目:用C++ 設(shè)計(jì)一個(gè)不能被繼承的類。

            分析:這是Adobe 公司2007 年校園招聘的最新筆試題。這道題除了考察應(yīng)聘者的C++ 基本功底外,還能考察反應(yīng)能力,是一道很好的題目。
            在Java 中定義了關(guān)鍵字final ,被final 修飾的類不能被繼承。但在C++ 中沒有final 這個(gè)關(guān)鍵字,要實(shí)現(xiàn)這個(gè)要求還是需要花費(fèi)一些精力。
            首先想到的是在C++ 中,子類的構(gòu)造函數(shù)會自動調(diào)用父類的構(gòu)造函數(shù)。同樣,子類的析構(gòu)函數(shù)也會自動調(diào)用父類的析構(gòu)函數(shù)。要想一個(gè)類不能被繼承,我們只要把它的構(gòu)造函數(shù)和析構(gòu)函數(shù)都定義為私有函數(shù)。那么當(dāng)一個(gè)類試圖從它那繼承的時(shí)候,必然會由于試圖調(diào)用構(gòu)造函數(shù)、析構(gòu)函數(shù)而導(dǎo)致編譯錯(cuò)誤。
            可是這個(gè)類的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是私有函數(shù)了,我們怎樣才能得到該類的實(shí)例呢?這難不倒我們,我們可以通過定義靜態(tài)來創(chuàng)建和釋放類的實(shí)例?;谶@個(gè)思路,我們可以寫出如下的代碼:
            ///////////////////////////////////////////////////////////////////////
            // Define a class which can't be derived from
            ///////////////////////////////////////////////////////////////////////
            class FinalClass1
            {
            public :
                  static FinalClass1GetInstance()
                  {
                        return new FinalClass1;
                  }
             
                  static void DeleteInstanceFinalClass1pInstance)
                  {
                        delete pInstance;
                        pInstance = 0;
                  }
             
            private :
                  FinalClass1() {}
                  ~FinalClass1() {}
            };
            這個(gè)類是不能被繼承,但在總覺得它和一般的類有些不一樣,使用起來也有點(diǎn)不方便。比如,我們只能得到位于堆上的實(shí)例,而得不到位于棧上實(shí)例。
            能不能實(shí)現(xiàn)一個(gè)和一般類除了不能被繼承之外其他用法都一樣的類呢?辦法總是有的,不過需要一些技巧。請看如下代碼:
            ///////////////////////////////////////////////////////////////////////
            // Define a class which can't be derived from
            ///////////////////////////////////////////////////////////////////////
            template <typename Tclass MakeFinal
            {
                  friend T;
             
            private :
                  MakeFinal() {}
                  ~MakeFinal() {}
            };
             
            class FinalClass2 : virtual public MakeFinal<FinalClass2>
            {
            public :
                  FinalClass2() {}
                  ~FinalClass2() {}
            };
            這個(gè)類使用起來和一般的類沒有區(qū)別,可以在棧上、也可以在堆上創(chuàng)建實(shí)例。盡管類 MakeFinal <FinalClass2> 的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是私有的,但由于類 FinalClass2 是它的友元函數(shù),因此在 FinalClass2 中調(diào)用 MakeFinal <FinalClass2> 的構(gòu)造函數(shù)和析構(gòu)函數(shù)都不會造成編譯錯(cuò)誤。
            但當(dāng)我們試圖從 FinalClass2 繼承一個(gè)類并創(chuàng)建它的實(shí)例時(shí),卻不同通過編譯。
            class Try : public FinalClass2
            {
            public :
                  Try() {}
                  ~Try() {}
            };
             
            Try temp;
            由于類 FinalClass2 是從類 MakeFinal <FinalClass2> 虛繼承過來的,在調(diào)用 Try 的構(gòu)造函數(shù)的時(shí)候,會直接跳過 FinalClass2 而直接調(diào)用 MakeFinal<FinalClass2> 的構(gòu)造函數(shù)。非常遺憾的是, Try 不是 MakeFinal <FinalClass2> 的友元,因此不能調(diào)用其私有的構(gòu)造函數(shù)。
            基于上面的分析,試圖從 FinalClass2 繼承的類,一旦實(shí)例化,都會導(dǎo)致編譯錯(cuò)誤,因此是 FinalClass2 不能被繼承。這就滿足了我們設(shè)計(jì)要求。

            posted on 2012-03-26 08:33 Snape 閱讀(210) 評論(0)  編輯 收藏 引用 所屬分類: C++ 轉(zhuǎn)載

            導(dǎo)航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            my

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品九九亚洲精品| 久久久久久亚洲Av无码精品专口| 成人国内精品久久久久影院VR| 亚洲午夜久久久精品影院| 久久夜色精品国产亚洲av| 久久久久国产精品嫩草影院| 国产精品99久久99久久久| 久久精品国产亚洲Aⅴ蜜臀色欲| 婷婷久久综合九色综合绿巨人| 久久久老熟女一区二区三区| 99久久亚洲综合精品成人| 精品综合久久久久久97| 91久久九九无码成人网站| 国产成人精品综合久久久久| 日韩一区二区久久久久久| 天天躁日日躁狠狠久久 | 国产69精品久久久久观看软件| 久久精品亚洲日本波多野结衣| 性做久久久久久久久| 免费精品99久久国产综合精品| 亚洲精品高清国产一线久久| 久久久精品日本一区二区三区| 国产精品久久久久9999| 色偷偷久久一区二区三区| 一本一道久久a久久精品综合| 91久久福利国产成人精品| 国内精品久久久久久野外| 久久久久人妻精品一区| 亚洲中文字幕无码久久2017| 久久久久久国产a免费观看黄色大片| 国产亚洲成人久久| 日本久久久精品中文字幕| 久久国产精品久久精品国产| 久久天堂AV综合合色蜜桃网| 亚洲狠狠婷婷综合久久蜜芽 | 久久免费视频网站| 国产精品国色综合久久| 99久久精品毛片免费播放| 国产精品18久久久久久vr| 欧美亚洲另类久久综合| 一本色道久久88加勒比—综合|