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

            醬壇子

            專注C++技術(shù) 在這里寫下自己的學習心得 感悟 和大家討論 共同進步(歡迎批評!?。。?/p>

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

            公告

            王一偉 湖南商學院畢業(yè) 電子信息工程專業(yè)

            常用鏈接

            留言簿(19)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 387837
            • 排名 - 64

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            如果我們現(xiàn)在在設(shè)計一個項目

            比如需要處理動物,我們會這樣設(shè)計

            ????????????????????? ----->?? lizard class???? 蜥蜴
            class animal
            ?????????????????????? -----> chicken class?? 雞

            class ?Animal
            {
            ????pubulic:
            ?????????Animal
            & ? operator ? = ?( const ?Animal & ?rhs);
            ?????????
            }
            ;
            class ?Lizard: public ?Animal
            {
            ?????
            public :
            ?????????Lizard
            & ? operator = ( const ?Lizard & ?ths);
            ?????????.
            }
            ;
            class ?Chichen: public ?Animal
            {
            ??????
            public :
            ??????Chichen
            & ? operator = ( const ?Chichen & ?rhs);
            ??????
            }
            ;

            現(xiàn)在我們只演示操作符

            現(xiàn)在如果有這樣一短代碼
            Animal* p1 = new Lizard;
            Animal* p2 = new Chichen;

            如果執(zhí)行p1 = p2,只有p1的animal部分會被修改,Lizard的其他menber沒有被改變,這個是正常的部分賦值現(xiàn)象。

            但是實際上我們不希望結(jié)果是這樣,
            如果要執(zhí)行繼承類的operator = 的話,你得在base class 中抽象"="
            virtual Animal&?operator?=?(const?Animal&?rhs);
            同樣在繼承類中

            virtual ?Chicken&?operator=(const?Chicken&?ths);
            virtual ?Lizard&??? operator=(const Lizard&?ths);????? //virtual 在繼承類中可以省略,但是仍然是抽象的,只是有了實現(xiàn)體而已

            這樣我們就能實現(xiàn)p1 = p2(我們把一只雞賦給了蜥蜴,典型的異型賦值);

            雖然在 C++中有強烈的型別轉(zhuǎn)換,但是這在C++中是允許的,Animal的virtual "="為異型賦值打開了大門

            我們希望當
            Animal* pAnimal1= new Lizard;
            Animal* pAnimal2= new Lizard;
            ...
            *pAnimal1 =? *pAnimal2;?? //呵呵,將蜥蜴給了蜥蜴

            但是我們不希望這樣的事情發(fā)生
            Animal* pAnimal1= new Lizard;
            Animal* pAnimal2= new Chichen;
            ...
            *pAnimal1 =? *pAnimal2;?? //呵呵,將小雞給了蜥蜴
            編譯器不能發(fā)現(xiàn)問題,但是在運行期會造成錯誤。

            所以我們希望當出現(xiàn)異型賦值的時候,operator = 能對此做一個判斷

            現(xiàn)在我們能通過 dynamic_cast實現(xiàn)我們的愿望
            Lizard& Lizard::operator = (const Animal&? ths)
            {
            ??????const Lizard& rhs_liz = dynamic_cast<const Lizard&>(rhs);
            ??????//如果轉(zhuǎn)型失敗,dynamic_cast會向外拋出Bad_cast exception
            }
            這個操作是可行的,但是對于每次賦值操作都是昂貴復(fù)雜的似乎有點不劃算。
            所以我們可以重載下operator = ,只對右邊參數(shù)為多態(tài)形式的指針或引用做dynamic_cast的處理
            而對于同型別的指針或者引用 我們則只需要進行copy,copy而已。
            so ,我們得有這個:
            Lizard& operator = (const Lizard& rhs);

            然而對于這樣的設(shè)計,Effective C++提出了疑問,某些編譯器并沒有支持dynamic_cast,還有對于exception的捕獲大多數(shù)程序員并不是太注重這樣的設(shè)計。所以并不是最好的解決上面部分賦值的辦法。

            Effective C++提供的模式是
            ???????????????????????????????????????????????????????????------> Lizard
            再申請另外一個類AbstractAnimal???------> Animal
            ???????????????????????????????????????????????????????????------>?Chicken
            讓AbstrctAnimal成為一個抽象類,一個無法被實體化的類,沒有任何menber function。Lizard,Animal和Chicken都繼承于AbstractAnimal.
            這個設(shè)計禁止了部分賦值和異型賦值,derive class同樣可以調(diào)用base class? 的operator =;
            AbstractAnimal 含有一個抽象類的必須----至少一個純虛函數(shù)。這里設(shè)計成他的Destructor.呵呵,這樣設(shè)計也是為了能很好的支持這些類的多態(tài)性,這個就不多說了。


            <附:文章非轉(zhuǎn)載,內(nèi)容雖然簡單,請不要砸磚頭?????????????????????????? 醬菜 2007.02.03凌晨12.30>





            posted on 2007-02-04 00:31 @王一偉 閱讀(924) 評論(0)  編輯 收藏 引用
            久久国产福利免费| 一本色道久久综合狠狠躁篇| 午夜精品久久久久9999高清| 国产高潮久久免费观看| 久久青青草原亚洲av无码app | 久久93精品国产91久久综合| 日本久久久精品中文字幕| 精品久久久久香蕉网| 成人妇女免费播放久久久| 久久综合噜噜激激的五月天| 乱亲女H秽乱长久久久| 久久久久久久久无码精品亚洲日韩| 久久人人爽人人爽人人av东京热| 2021国产精品午夜久久| 97久久国产综合精品女不卡| 伊人久久大香线蕉综合影院首页| 色婷婷综合久久久久中文| 国产一级做a爰片久久毛片| 国产精品美女久久久久AV福利| 香蕉久久夜色精品国产小说| 久久久久国产精品麻豆AR影院| 久久亚洲欧洲国产综合| 无码AV波多野结衣久久| 精品久久久久久国产| 久久久久亚洲精品无码网址| 亚洲精品无码久久毛片| 色综合久久无码五十路人妻| 久久97精品久久久久久久不卡| 久久亚洲国产成人影院网站| 日产精品久久久一区二区| 亚洲综合婷婷久久| 久久精品aⅴ无码中文字字幕不卡| 久久午夜羞羞影院免费观看| 久久国产乱子精品免费女| 亚洲国产精品成人久久蜜臀| 久久精品99久久香蕉国产色戒| 国内精品久久久久久久影视麻豆| 精品久久久久久久国产潘金莲| 国产精品久久久久久久| 国内精品久久久久影院亚洲| 久久99国产精一区二区三区 |