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

            琴弦上的熊

            Machine should work, people should think...

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              2 隨筆 :: 1 文章 :: 1 評論 :: 0 Trackbacks
            淺析對象模型及多態的內在實現
            Dissecting The Object Model and the Internal Implementation of Polymorphism

            文:藍色feel
            日期:2003年11月14日

            概要:此文用簡明扼要的語言解釋了為什么多態是由指向對象的指針以及引用而不是對象本身來實現。

            對象的理念以及對對象模型的思考(Basic concept of object and thinking in object model):

            在面向對象的程序中。一個程序是由一些對象及其相互間的作用構成的。對象是被聲明(declaration)的,其類型是確定的。所謂轉型(type conversion)操作,本質上是對象拷貝的轉型。舉個簡單例子,對于已聲明變量 float var 而言,我們將其強制類型轉換為 int ,此時,編譯器先將 var 制作一份拷貝 var_tmp,再將 var_tmp 轉化為 int 型,而 var 本身是不變的。

            由此可見,對象是確定的,非多態的,其行為僅限于該對象所屬數據類型的方法(function)(包括該類型基類的方法)。

            由于對象的類型確定性,對象不能支持多態,所有有關對象的操作均是靜態的(static)是能夠事先認定的,是能夠在編譯期被計算及綁定的,因此對于一個已被聲明的對象(declared object)而言,已喪失了執行期(運行時,run-time)的彈性。

            多態的實現(Implementation of Polymorphism):

            此程序設計典范(programming paradigm)在具體的程序中是由指針或引用這種對對象的間接操作所實現的。

            為什么不能直接對對象應用多態,而是要通過指針或引用這種間接方式來應用呢?

            一個對象,其大小在其被聲明時已被確定(即是所有數據成員按32位對齊后的總和),如果非要對其應用多態,即非要讓系統在運行期將其看作另一種類型(極有可能是基類或派生類)的對象,那么由于兩種數據類型占據的內存字節數不同,或即使相同其解釋方式不同,類型轉換后,對象要么被切割,要么被擴充進一些垃圾字節(怎么變化要看目標類型對于源類型的字節數大小)此時的操作是不安全的。
            然而對于一個指針而言,其大小是確定的(在32位的機器上均為一個32位的遠指針)無論其指向什么類型的對象,其大小都是不變的。因此,指針從其本身特性上講是類型靈活的,應用程序完全可以籍由操作系統的支持在執行期動態改變其指向的類型而不用擔心指針會被切割或擴充。因此指針適合于用來從語言層面上實現多態。

            引用對于編譯器而言是通過指針來實現的,故在本質上與指針的行為并無不同

            推論:

            對于一個類體系,直接定義基類對象A,那么A的行為僅限于基類。但若定義該基類對象的指針或引用B,那么B的行為可擴展至該基類及其派生類

            實例:

            class BaseClass; // 聲明基類
            class DeriveClass; // 聲明派生類

            BaseClass ObjectEntity; // 聲明基類對象A
            BaseClass * pBaseObject = RetrieveData(); // 聲明基類指針B
            BaseClass & rBaseObject = * pBaseObject ; // 聲明基類引用C

            則A一定是基類對象,他的行為就被限定在基類中了。而B和C要么指向基類對象,要么指向其子類型(即派生類對象),他們既可以被基類方法,也可以被派生類的方法當做不同的類型來操作。
            posted on 2006-07-26 19:09 琴弦上的熊 閱讀(132) 評論(0)  編輯 收藏 引用
            国产精品成人精品久久久| 欧美与黑人午夜性猛交久久久| 思思久久精品在热线热| 亚洲狠狠婷婷综合久久蜜芽| 久久久久四虎国产精品| 亚洲国产香蕉人人爽成AV片久久| 久久亚洲精精品中文字幕| 精品水蜜桃久久久久久久| 亚洲午夜久久久久妓女影院| 狠狠精品久久久无码中文字幕 | 国产激情久久久久久熟女老人| 麻豆成人久久精品二区三区免费| 久久国产精品波多野结衣AV | 77777亚洲午夜久久多人| 久久精品男人影院| 亚洲va久久久噜噜噜久久狠狠| 久久精品成人影院| 久久夜色精品国产亚洲| 久久精品亚洲日本波多野结衣 | 精品久久久久久国产牛牛app | 久久亚洲AV无码精品色午夜麻豆| 91精品无码久久久久久五月天| 亚洲精品美女久久久久99| 香蕉久久AⅤ一区二区三区| 国产精品日韩深夜福利久久| 国产精品久久久亚洲| 久久免费的精品国产V∧| 日韩精品久久久久久免费| 国产毛片欧美毛片久久久| 国产成人精品久久| 久久亚洲AV成人出白浆无码国产| 人妻精品久久无码区| 久久婷婷国产综合精品| 国产成人久久AV免费| 久久国产成人精品麻豆| 99久久婷婷国产一区二区| 91精品国产高清久久久久久91| 国产精品伦理久久久久久| 久久久久久A亚洲欧洲AV冫| 久久频这里精品99香蕉久| 嫩草伊人久久精品少妇AV|