• <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++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              2 隨筆 :: 1 文章 :: 1 評(píng)論 :: 0 Trackbacks
            淺析對(duì)象模型及多態(tài)的內(nèi)在實(shí)現(xiàn)
            Dissecting The Object Model and the Internal Implementation of Polymorphism

            文:藍(lán)色feel
            日期:2003年11月14日

            概要:此文用簡(jiǎn)明扼要的語(yǔ)言解釋了為什么多態(tài)是由指向?qū)ο蟮闹羔樢约耙枚皇菍?duì)象本身來(lái)實(shí)現(xiàn)。

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

            在面向?qū)ο蟮某绦蛑小R粋€(gè)程序是由一些對(duì)象及其相互間的作用構(gòu)成的。對(duì)象是被聲明(declaration)的,其類(lèi)型是確定的。所謂轉(zhuǎn)型(type conversion)操作,本質(zhì)上是對(duì)象拷貝的轉(zhuǎn)型。舉個(gè)簡(jiǎn)單例子,對(duì)于已聲明變量 float var 而言,我們將其強(qiáng)制類(lèi)型轉(zhuǎn)換為 int ,此時(shí),編譯器先將 var 制作一份拷貝 var_tmp,再將 var_tmp 轉(zhuǎn)化為 int 型,而 var 本身是不變的。

            由此可見(jiàn),對(duì)象是確定的,非多態(tài)的,其行為僅限于該對(duì)象所屬數(shù)據(jù)類(lèi)型的方法(function)(包括該類(lèi)型基類(lèi)的方法)。

            由于對(duì)象的類(lèi)型確定性,對(duì)象不能支持多態(tài),所有有關(guān)對(duì)象的操作均是靜態(tài)的(static)是能夠事先認(rèn)定的,是能夠在編譯期被計(jì)算及綁定的,因此對(duì)于一個(gè)已被聲明的對(duì)象(declared object)而言,已喪失了執(zhí)行期(運(yùn)行時(shí),run-time)的彈性。

            多態(tài)的實(shí)現(xiàn)(Implementation of Polymorphism):

            此程序設(shè)計(jì)典范(programming paradigm)在具體的程序中是由指針或引用這種對(duì)對(duì)象的間接操作所實(shí)現(xiàn)的。

            為什么不能直接對(duì)對(duì)象應(yīng)用多態(tài),而是要通過(guò)指針或引用這種間接方式來(lái)應(yīng)用呢?

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

            引用對(duì)于編譯器而言是通過(guò)指針來(lái)實(shí)現(xiàn)的,故在本質(zhì)上與指針的行為并無(wú)不同

            推論:

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

            實(shí)例:

            class BaseClass; // 聲明基類(lèi)
            class DeriveClass; // 聲明派生類(lèi)

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

            則A一定是基類(lèi)對(duì)象,他的行為就被限定在基類(lèi)中了。而B(niǎo)和C要么指向基類(lèi)對(duì)象,要么指向其子類(lèi)型(即派生類(lèi)對(duì)象),他們既可以被基類(lèi)方法,也可以被派生類(lèi)的方法當(dāng)做不同的類(lèi)型來(lái)操作。
            posted on 2006-07-26 19:09 琴弦上的熊 閱讀(130) 評(píng)論(0)  編輯 收藏 引用

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


            日韩人妻无码一区二区三区久久| 99久久做夜夜爱天天做精品| 欧美精品丝袜久久久中文字幕| 久久国产精品99国产精| 久久国产热精品波多野结衣AV| 精品一区二区久久| 久久久久久一区国产精品| 中文成人久久久久影院免费观看 | 国产福利电影一区二区三区久久久久成人精品综合 | 久久精品三级视频| 久久久久久精品久久久久| 精品乱码久久久久久久| 久久久久99精品成人片牛牛影视 | 久久精品国产99久久无毒不卡 | 品成人欧美大片久久国产欧美...| 伊人热热久久原色播放www| 亚洲AV无码久久精品色欲| 久久综合九色综合久99| 久久久久久精品成人免费图片 | 久久亚洲日韩看片无码| 久久久青草青青亚洲国产免观 | 国产精品一区二区久久不卡| 热RE99久久精品国产66热| 粉嫩小泬无遮挡久久久久久| 欧美伊人久久大香线蕉综合| 国产精品欧美久久久久天天影视| 亚洲综合日韩久久成人AV| 成人精品一区二区久久| 久久人人爽爽爽人久久久| 久久久久久免费视频| 热久久这里只有精品| 色偷偷久久一区二区三区| 久久精品久久久久观看99水蜜桃| 久久久久99精品成人片牛牛影视| 国产一级做a爰片久久毛片| 亚洲国产精品无码久久SM| 一级做a爰片久久毛片看看| 久久成人18免费网站| 国产免费久久久久久无码| 久久久精品午夜免费不卡| 国产午夜免费高清久久影院|