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

            jake1036

            為多態(tài)基類聲明virtual析構函數(shù)

                            為多態(tài)基類聲明virtual 析構函數(shù)

               一  首先看下面的代碼

                      
            #inclue <isotream>
              
            using namespace std ;
              
              
            class TimeKeeper//基類 
                 public :
                    TimeKeeper() ;      
                    
            ~TimeKeeper() ;        
              }
             ;

              
            class AtomicClck : public TimeKeeper //原子鐘 
              {
                    
              }
             ; 
             
               
            class WaterClck : public TimeKeeper  //水鐘  
              {
                    
              }
             ; 

              
            class WristClck : public TimeKeeper //腕表 
              {
                    
              }
             ; 

              
            int main()
              
            {
                 
                 TimeKeeper 
            * ptk = getTimeKeeper() ; //工廠方法獲取鐘的對象 
                 
                 
                 delete ptk ;  
            //由于父類中的析構函數(shù)聲明為非virtual,所以只會執(zhí)行父類的析構函數(shù)
                               
            //這樣就會造成子類中特有成員內(nèi)存泄露 
                    
              }


              由于TimeKeeper的析構函數(shù)沒有設置成為virtual,造成子類進行delete操作的時候,內(nèi)存可能會發(fā)生泄漏,因為delete只會執(zhí)行基類的析構函數(shù)。
             
               virtual 函數(shù)的作用是,允許子類對基類的操作進行客制化,所以如果父類中存在一個成員函數(shù)是virtual,那么可以肯定的是,需要設置父類的virtual 析構函數(shù)。




            二 virtual 多余添加

            當一個class 中不含有virtual函數(shù),則表明它不打算作為基類使用,這時候如果令其析構函數(shù)為virtual,則會造成不必要的麻煩。
             考慮下面的簡單類實例
                
            class Point
              
            {
                 
            public :
                   Point(
            int x, int y) ;   
                   
            ~Point() ;
                 
            private :
                   
            int x , y ;            
              }
             ;


              該類只含有兩個整形變量,所以它的大小是64bits,但是如果將析構函數(shù)變?yōu)関irtual,則結果是96bits
              原因是,為了在運行期動態(tài)地執(zhí)行函數(shù),對象就需要存儲某些信息,需要給出一個虛函數(shù)指針。
               vptr指向一個函數(shù)指針數(shù)組,每一個class都有一個函數(shù)指針數(shù)組。當對象調(diào)用一個virtual時,實際被調(diào)用的
               函數(shù)取決于該對象的vptr指向的那個vtbl,編譯器在其中尋找適當?shù)暮瘮?shù)指針。

              所以如果一個對象中含有virtual函數(shù),則對象的體積就會變大。
               

             三 純虛函數(shù) 

             有時候可以使用純虛析構函數(shù),這時候該類為抽象類,即不能進行實例化的類。
             

            四 總結
                 (1) 有些基類就是為了作為base類,為了使用多態(tài)機制,那么我們需要為這些類得析構函數(shù)使用virtual。
                 (2) 有些類就不是為了作為base類,string 或者一些stl,那么我們就不需要使用vlirtual
                 (3) 基類中某個函數(shù)使用了virtual ,那么我們就需要為這個類得析構函數(shù),使用virtual。
             

             

             






             

            posted on 2011-05-03 11:30 kahn 閱讀(634) 評論(0)  編輯 收藏 引用 所屬分類: c++學習總結

            亚洲精品无码专区久久久| 日批日出水久久亚洲精品tv| 久久久99精品成人片中文字幕| A级毛片无码久久精品免费| 久久国产成人精品国产成人亚洲| 欧美性猛交xxxx免费看久久久| 亚洲国产婷婷香蕉久久久久久| 99精品国产在热久久无毒不卡| 国产精品综合久久第一页| 国产2021久久精品| 日韩人妻无码一区二区三区久久99| 久久精品无码一区二区无码| 久久久综合香蕉尹人综合网| 久久国产精品成人免费| 国产成人精品综合久久久久 | 久久久国产精品福利免费| 亚洲国产精品无码久久一区二区 | 大香网伊人久久综合网2020| 伊人久久成人成综合网222| 99久久精品国产免看国产一区| 午夜视频久久久久一区| 日本久久久久久中文字幕| 久久久久久久久久久精品尤物 | 久久久久国产亚洲AV麻豆| 国产三级久久久精品麻豆三级 | 国产精品久久网| 亚洲欧美伊人久久综合一区二区| 狠狠色综合久久久久尤物| 久久99中文字幕久久| 久久精品人人做人人爽97| 精品无码久久久久国产动漫3d| 久久久久女教师免费一区| 草草久久久无码国产专区| 人人狠狠综合久久亚洲婷婷| 97久久香蕉国产线看观看| 精品少妇人妻av无码久久| 久久亚洲精精品中文字幕| 国内精品久久久久久野外| 国产人久久人人人人爽| 91精品国产9l久久久久| 亚洲欧洲日产国码无码久久99|