• <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>

            攀升·Uranus


            Something Different,Something New
            數據加載中……

            public繼承后,父類與子類訪問隱藏 熟練c/c++(三)

                     《Effective C++》的第六章節繼承與面向對象設計花了大部分的篇幅在介紹繼承遮掩(Hiding Inherited Name),那我也效仿下大師,做個小的總結。
                     public繼承的目的是要建立父子類的is-a關系,也就是說用到父類的地方,在子類一定能用。現實的代碼編寫中,我們主要也是用public繼承,所以每個人都有自己一套繼承的寫法和調用,直到看到Effecitve C++時,才會發現還有很多其它的用法,在這里我并不鼓勵大家嘗試各種寫法,畢竟代碼要穩定,我只是想把一些可能的形式表現出來,供大家參考。
            class Base
            {
             public:
                   virtual void fn() = 0;
                   virtual void fn(int i){printf("\n Base: fn(int)\n");};
                   virtual void fn2() {printf("\n Base: void fn2(int)\n");}
                   void fn3() {printf("\n Base: fn3()\n");}
                   void fn4(){printf("\n Base: fn4()\n");}
            };

            class ClassA : public Base
            {
            public:
                  ClassA(int n, int d);
                  // using Base::fn2;
                  virtual void fn(){printf("\n ClassA: fn()\n");};
                   virtual void fn(int i){printf("\n ClassA: fn(INT)\n");};

                   virtual void fn2(int i) {printf("\n ClassA: fn2(INT)\n"); }

                   void fn3() {printf("\n ClassA: fn3()\n");}
                   void fn4(int i){printf("\n ClassA: fn4()\n");}
             };
            int main()

            Base* pBase1 = new ClassA(10, 20);
             pBase1->fn();              //OK,ClassA: fn()
             pBase1->fn(11);          //OK,ClassA: fn(INT)
             pBase1->fn2();            //OK,Base: void fn2(int)
             pBase1->fn2(2);          //NO, 不能訪問
             pBase1->fn3();            //OK,Base: fn3()
             pBase1->fn4();            //OK,Base: fn4()
             pBase1->fn4(2);          //NO,不能訪問
             printf("\n============================================\n");
             ClassA* pDerived = new ClassA(10, 20);
             pDerived->fn();            //OK,ClassA: fn()
             pDerived->fn(1);          //OK,ClassA: fn(INT)
             pDerived->fn2();          //NO,不能訪問
             pDerived->fn2(2);        //OK,ClassA: fn2(INT)
             pDerived->fn3();          //OK,ClassA: fn3()
             pDerived->fn4();          //NO,不能訪問
             pDerived->fn4(2);        //NO,ClassA: fn4(INT)
             printf("\n============================================\n");
             return 0;      
            }


            子類父類同名virtual函數(參數相同), 用子類的指針,引用,對象訪問時,子類會覆蓋父類方法(只能訪問子類方法)。
            子類父類同名virtual函數(參數相同), 用父類的指針,引用,對象訪問時,子類會覆蓋父類方法(只能訪問子類方法)。
            子類父類同名virtual函數(參數不同), 用子類的指針,引用,對象訪問時,子類會覆蓋父類方法(只能訪問子類方法)。
            子類父類同名virtual函數(參數不同), 用父類的指針,引用,對象訪問時,父類會覆蓋子類方法(只能訪問父類方法)。
            子類父類同名virtual函數(函數類型不同const/non-const), 用子類的指針,引用,對象訪問時,子類會覆蓋父類方法(只能訪問子類方法)。
            子類父類同名virtual函數(函數類型不同const/non-const), 用父類的指針,引用,對象訪問時,父類會覆蓋子類方法(只能訪問父類方法)。

            結論:參數和函數類型是c++編譯器判斷要不要多態的關鍵因素。注: 返回類型不同時,編譯器會報錯,virtual不能和static連用。靜態成員函數,沒有隱藏的this指針,virtual函數一定要通過對象來調用,既要this指針。
            改進::如果子類指針想訪問到父類,可以在子類里加入:using 父類名::函數名;如pDerived->fn2(); 訪問父類方法,在ClassA里面加入using Base::fn2,就可以訪問了。如果父類指針想訪問到子類,就需要指針轉換了。

            子類父類同名non-virtual函數(無論參數/返回/函數類型(const或static)),用子類的指針,引用,對象訪問,子類會覆蓋父類方法(只能訪問子類方法)。
            子類父類同名non-virtual函數(無論參數/返回/函數類型(const或static)),用父類的指針,引用,對象訪問,父類會覆蓋子類方法(只能訪問父類方法)。

            結論: non-virtual函數,既沒有任何多態效果,如果父類要訪問子類,只用指針轉換。   

                     所謂大道至簡,想必大家看著這個都煩,我也是。想了想應該這樣表達最簡單:
             
                     子類public繼承父類的函數,唯有滿足(參數,返回值,函數類型相同&父類是virtual)函數,父類的指針,引用(也指針實現的)能夠多態的訪問子類,否則父類指針只能訪問父類的方法。 
                     
                     子類public繼承父類的函數,子類的方法名會遮掩父類的相同名的方法。子類要想訪問父類的方法,使用using 父類名::函數名。    
                   
                     具體的原因我覺得可能還是得找時間拜讀下候杰譯的《C++對象模型》,看看到底這個東西是怎么設計的。

            posted on 2009-01-05 11:16 攀升 閱讀(6346) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            久久亚洲国产成人精品性色| 88久久精品无码一区二区毛片 | 色综合久久久久网| 66精品综合久久久久久久| 狠狠色丁香婷婷久久综合五月| 久久综合狠狠综合久久| 国内精品伊人久久久久影院对白| 蜜桃麻豆WWW久久囤产精品| 国内精品久久久久影院免费| 久久热这里只有精品在线观看| 国产亚洲婷婷香蕉久久精品| 久久综合视频网| 精品国产综合区久久久久久 | 国产成人久久精品一区二区三区| 久久99国产综合精品免费| 久久免费99精品国产自在现线 | 精品久久久无码21p发布| 99国内精品久久久久久久| 久久精品国产亚洲av高清漫画| 久久综合鬼色88久久精品综合自在自线噜噜| 久久99精品久久久久久hb无码| 久久人妻少妇嫩草AV蜜桃| 中文国产成人精品久久亚洲精品AⅤ无码精品| 99精品国产在热久久无毒不卡| 久久AV无码精品人妻糸列| 一本大道久久东京热无码AV | 国产精品成人久久久久久久| 久久亚洲AV成人出白浆无码国产 | 亚洲精品乱码久久久久久蜜桃不卡| 久久精品国产精品亚洲下载| 四虎国产精品免费久久久| 狠狠色婷婷综合天天久久丁香| 久久精品中文无码资源站| 久久精品亚洲精品国产色婷| 久久久亚洲欧洲日产国码二区 | 亚洲天堂久久精品| 99久久国产综合精品五月天喷水| 94久久国产乱子伦精品免费| 久久亚洲中文字幕精品一区四 | 国色天香久久久久久久小说| 久久www免费人成看片|