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

            Welcome to ErranLi's Blog!

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

            常用鏈接

            留言簿(12)

            搜索

            •  

            積分與排名

            • 積分 - 177261
            • 排名 - 151

            最新評(píng)論

            閱讀排行榜

                
            如果在派生類(lèi)中要重載派生類(lèi)的operator = ,那么在基類(lèi)中一般不要重載operator = ,因?yàn)檫@樣會(huì)帶來(lái)很多麻煩.

            定義了兩個(gè)類(lèi):
             class CBase
            {  
            public:
               CBase()
               {
                    cout<<"CBase constructing ..."<<endl;
                }
               virtual ~CBase()
               {
                    cout<<"CBase destructing ..."<<endl;
                }
            public:
               CBase & operator=(const CBase & ent)
               {
                     cout<<"CBase operator = ... "<<endl;
                     return *this;
                }
            };

            class CDerive: public CBase
            {
            public:
                 CDerive()
                 {
                       cout<<"CDerive constructing 
                 }
                 ~CDerive()
                 {
                        cout<<"CDerive destructing ..."<<endl;
                  } 
            public:
                 CDerive & operator=(const CDerive & ent)
                {
                       cout<<"CDerive operator = ... "<<endl;
                       return *this;
                 }
            }

            定義如下操作:

            CBase * b1 = new CDerive();
            CBase * b2 = new CDerive();

            (*b1) = (*b2);

            可以看到其輸出為:
            CBase constructing ...
            CDerive constructing ...
            CBase constructing ...
            CDerive constructing ...
            CBase operator = ...
            CDerive destructing ...
            CBase destructing ...
            CDerive destructing ...
            CBase destructing

            而實(shí)際上,操作(*b1) = (*b2)是想把b1,b2實(shí)際所指類(lèi)型的兩個(gè)對(duì)象之間進(jìn)行賦值,但是它只是調(diào)用了基類(lèi)的賦值操作,沒(méi)有執(zhí)行其本身派生類(lèi)的賦值操作。

            發(fā)現(xiàn)有兩種方法可以解決這個(gè)問(wèn)題,如果能夠知道基類(lèi)指針實(shí)際所指的是哪個(gè)派生類(lèi)的的對(duì)象,直接類(lèi)型轉(zhuǎn)換就可以了:

            (*((CDerive*)b1)) = (*((CDerive*)b2));

            這樣可以發(fā)現(xiàn)輸出了:CDerive operator = ... 。但是當(dāng)要定義基類(lèi)的指針的時(shí)候,往往隱藏了具體的派生類(lèi),即往往不知道指針到底實(shí)現(xiàn)的是哪個(gè)派生類(lèi),所以這種方法有很多局限性。

            這時(shí)候可以采用第二種方法,即在派生類(lèi)中重載基類(lèi)的賦值操作符,即首先把基類(lèi)的operator=定義為virtual operator=,再在派生類(lèi)中重載這個(gè),如:

            CBase & operator=(const CBase & ent)
             {
                   const CDerive * p = reinterpret_cast<const CDerive *>(&ent);
                   return operator=((*p));
             }

            好的,當(dāng)再執(zhí)行 (*b1) = (*b2) 的時(shí)候就可以看到輸出:CDerive operator = ... 。


             在此發(fā)現(xiàn)在派生類(lèi)中重載派生類(lèi)的operator =的時(shí)候,如果在基類(lèi)中也重載operator = ,這樣會(huì)帶來(lái)很多麻煩,可能會(huì)丟失很多也許不想丟失的數(shù)據(jù)。
             
            同樣,依次還存在問(wèn)題:
            CBase * b1 = new CDerive();
            CDervie * d1 = new CDerive();

            (*b1) = (*d1);

            CBase * b2 = new CBase ();
            CDervie * d2 = new CDerive();
            (*b2) = (*d2);

            所以我個(gè)人覺(jué)得,如果一個(gè)基類(lèi)有很多個(gè)派生類(lèi)的,而派生類(lèi)中又重載了派生類(lèi)本身的賦值操作符的時(shí)候,則基類(lèi)中最好不要去重載賦值操作符,不如直接用函數(shù)去賦值。正如所說(shuō)那樣,運(yùn)算符重載只是為了一種語(yǔ)法上的方便,是另外一種函數(shù)調(diào)用方式,如果不能帶來(lái)方便,就沒(méi)必要了,還不如直接用函數(shù)去代替。


            .............敬請(qǐng)指點(diǎn)..................
            posted on 2006-05-22 01:09 erran 閱讀(1663) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): C & C++

            Feedback

            # re: C++隨筆 關(guān)于virtual operator = 2006-06-02 08:26 LOGOS
            嗯,在有繼承的體系中,重載賦值操作符的確會(huì)發(fā)生很多災(zāi)難性的事情。
            增加知識(shí)了。  回復(fù)  更多評(píng)論
              

            # re: C++隨筆 關(guān)于virtual operator = 2009-11-23 13:58 Noock Tian
            CBase & operator=(const CBase & ent)
            {
            const CDerive * p = reinterpret_cast<const CDerive *>(&ent);
            return operator=((*p));
            }
            這個(gè)實(shí)現(xiàn)是有問(wèn)題的,返回值應(yīng)該是
            CDerived& operator=(const CDerived& other)
            {
            CBase::operator=(other);
            // Copy new members in CDerived
            return *this;
            }
              回復(fù)  更多評(píng)論
              

            精品久久久无码21p发布| 久久一区二区免费播放| 狠狠色丁香婷综合久久| 精品无码久久久久久国产| 狠狠色噜噜色狠狠狠综合久久| 亚洲女久久久噜噜噜熟女| 91精品国产91久久久久久| 亚洲va国产va天堂va久久| 91精品免费久久久久久久久| 亚洲精品乱码久久久久66| 久久99精品国产麻豆不卡| 久久亚洲精品中文字幕| 中文成人无码精品久久久不卡| 久久r热这里有精品视频| 亚洲国产另类久久久精品| 亚洲精品无码久久久| 青青青伊人色综合久久| 久久久久久午夜成人影院| 一本色道久久综合狠狠躁| 亚洲午夜久久久| 亚洲?V乱码久久精品蜜桃 | 狠狠狠色丁香婷婷综合久久五月 | 国产精品无码久久久久久| 久久精品综合网| 综合久久给合久久狠狠狠97色| 国产福利电影一区二区三区久久久久成人精品综合 | 麻豆久久| 久久无码国产| 热RE99久久精品国产66热| 精品久久人人爽天天玩人人妻| 久久91综合国产91久久精品| 国产精品一区二区久久不卡| 久久久久久人妻无码| 丰满少妇高潮惨叫久久久| 国内精品人妻无码久久久影院| 亚洲精品乱码久久久久久 | 久久露脸国产精品| 无码人妻少妇久久中文字幕 | 国产精品成人久久久久三级午夜电影| 精品一区二区久久久久久久网站| 国产韩国精品一区二区三区久久|