• <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ù) 在這里寫下自己的學(xué)習(xí)心得 感悟 和大家討論 共同進(jìn)步(歡迎批評(píng)!!!)

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

            公告

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

            常用鏈接

            留言簿(19)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            積分與排名

            • 積分 - 388624
            • 排名 - 64

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

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

            比如需要處理動(dòng)物,我們會(huì)這樣設(shè)計(jì)

            ????????????????????? ----->?? 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部分會(huì)被修改,Lizard的其他menber沒有被改變,這個(gè)是正常的部分賦值現(xiàn)象。

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

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

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

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

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

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

            所以我們希望當(dāng)出現(xiàn)異型賦值的時(shí)候,operator = 能對(duì)此做一個(gè)判斷

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

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

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


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





            posted on 2007-02-04 00:31 @王一偉 閱讀(927) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            色综合久久天天综合| 久久久这里只有精品加勒比| 久久99精品久久久久婷婷| 无码国产69精品久久久久网站| 99久久精品国产一区二区| 久久国产精品99精品国产987| 久久久久亚洲AV成人网| 亚洲中文字幕无码久久精品1| 久久久久久毛片免费播放| 久久精品无码一区二区三区免费| 18岁日韩内射颜射午夜久久成人| 国产精品久久99| 久久毛片一区二区| 国产精品青草久久久久福利99| 香蕉久久夜色精品国产2020| 久久精品国内一区二区三区| 久久精品aⅴ无码中文字字幕不卡| 久久国产视屏| 久久久中文字幕| 久久亚洲AV成人无码国产 | 69SEX久久精品国产麻豆| 久久亚洲av无码精品浪潮| 亚洲欧美日韩精品久久| 国产精品美女久久久久| 亚洲精品乱码久久久久久中文字幕| 久久一本综合| 久久久久国产精品麻豆AR影院 | 蜜桃麻豆WWW久久囤产精品| 免费国产99久久久香蕉| 久久久无码精品亚洲日韩蜜臀浪潮 | 久久精品中文字幕第23页| 国产精品美女久久久久网| 久久婷婷国产综合精品| 亚洲精品美女久久777777| 中文字幕久久精品无码| 久久人人爽人人爽人人爽| 久久频这里精品99香蕉久| 狠狠色噜噜色狠狠狠综合久久| 久久强奷乱码老熟女网站| 欧美精品久久久久久久自慰| 精品蜜臀久久久久99网站|