• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    細談C++多態性的“動”與“靜”

    發布: 2008-6-10 16:33 | 作者: 不詳 | 來源: 天極網 | 查看: 70次 | 進入軟件測試論壇討論

    領測軟件測試網 關鍵字:C++ “動”與“靜”

     在我們討論多態的時候,先看看什么是硬編碼和軟編碼:硬編碼就是把代碼寫死了,導致彈性不足,降低了可擴展性,例如在代碼里的: if...else...;switch...case...
      
      這些代碼通常都屬于硬編碼,項目中的這些代碼多了,就相當于說明這個代碼的靈活性、擴展性、彈性等等的少了。

      所以,我們要盡量使用軟編碼,通俗點就是“別把話說死了,留點轉彎的余地”。多態性就是這種軟編碼特性的反映,下面我們一起來研究一下多態性。

      多態性是一種抽象,把事物的特征抽象出來,然后事物的具體形態我們就不關心了。

      例如對工人這種事物來說,他的特征就是工作,至于是什么工人,他做什么工作,我們就不用關心了,只要我們以“工人.工作”這種方式去調用。那他就會為我們工作了。

      那為什么我們不抽象出其他的特征,只抽象出工作這個特征呢?因為我們只對這個特征感興趣,他的什么吃飯、睡覺、如廁等的特性我們都不關心了。有了多態,我們就可以實現軟編碼了!

      講解了多態的概念之后,我們來看看多態的實現(C++的實現):

      多態的實現是通過虛函數表(VTable),每個類如果有虛函數,那它就有一個虛函數表,所有的對象都共享這一個VTable。這個概念也叫做動態聯編,還有靜態聯編,這些概念都是通過在程序執行的時候表現出來的性質來定的,我們下面會看看它的“動”和“靜”究竟體現在哪里。

      先看一段代碼:

      class C0
      ...{
      public:
      void Test()
      ...{
      cout << "call C0 Test()。" << endl;
      }
      };

      這個類沒有虛函數,調用的時候就是靜態調用。調用的代碼如下:

      // 靜態編譯(早綁定 early binding)
      C0 *pO0;
      C0 obj0;
      pO0 = &obj0;
      pO0->Test();
      它的反匯編代碼如下:

      // 直接調用函數(已經知道地址)
      00401432 mov ecx,dword ptr [ebp-0Ch]
      00401435 call @ILT+160(C0::Test) (004010a5)
      下面看看帶虛函數的類:

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: 多態

    31/3123>

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>