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

            Kisser Leon

            這個(gè)kisser不太冷
            posts - 100, comments - 102, trackbacks - 0, articles - 0

            c++只支持單分派(single dispatch) 探討2

            Posted on 2007-03-13 11:36 kk 閱讀(898) 評(píng)論(2)  編輯 收藏 引用 所屬分類: C++
            上次寫了一下,結(jié)果漏洞百出,sigh。不過在高手的批評(píng)下,本人再多try了幾下,似乎又明白了不少,呵呵。如果有問題,請(qǐng)各位高手不吝賜教。謝謝哈!
            下面演示了一下c++不支持雙分派。一共有四各類,A, AD, B, BE, 其中AD是A的子類,BE是B的子類。他們都有一個(gè)叫output的函數(shù)(函數(shù)名不一定要一樣的)。問題出現(xiàn)在哪里呢?問題出現(xiàn)在A或AD類中output函數(shù)里的b->output(a);這個(gè)語句。其中b是能夠動(dòng)態(tài)track到他自己的類型的,但是a就不行了!因?yàn)樗呀?jīng)被靜態(tài)綁定到A類型了,所以輸出結(jié)果是:
            output信息:
            ///////////////////////////////
            AD:BE
            BE:A //如果正確的話,這里應(yīng)該輸出BE:AD
            AD:B
            B:A? //如果正確的話,這里應(yīng)該輸出B:AD

            AD:BE
            BE:A
            A:B
            B:A

            ///////////////////////////////
            現(xiàn)在把接口改成AD*a, 顯示出錯(cuò)信息:
            error: invalid conversion from `A*' to `AD*'
            ///////////////////////////////

            現(xiàn)在把b->output(a)改成b->output(this),輸出結(jié)果如下:
            AD:BE
            BE:AD
            AD:B
            B:AD

            AD:BE
            BE:A
            A:B
            B:A
            ///////////////////////////////
            結(jié)果就正確了!因?yàn)閠his顯然已經(jīng)指向了正確的類型,而且也沒有經(jīng)過中間步驟地轉(zhuǎn)換,所以其信息還是能夠runtime找到的。
            over。

            不知上面的解釋是否正確,如果有問題,請(qǐng)各位高手賜教了。小弟先謝謝了。



            代碼如下:
            ////////////////////////////////////
            #include <iostream>
            #include <list>
            using namespace std;

            class A;
            class AD;
            //B
            class B
            {
            public:
            ?void virtual output(A * a){cout << "B:A" << endl;}
            ?void virtual output(AD * ad){cout << "B:AD" << endl;}
            };
            class BE : public B
            {
            public:
            ?void output(A * a){cout << "BE:A" << endl;}
            ?void output(AD * ad){cout << "BE:AD" << endl;}
            };

            //A
            class A
            {
            public:
            ?void virtual output(B * b, A * a){cout << "A:B" << endl;b->output(a);}
            ?void virtual output(BE * b, A * a){cout << "A:BE" << endl;b->output(a);}
            };
            class AD : public A
            {
            public:
            ?void output(B * b, A * a){cout << "AD:B" << endl;b->output(a);}
            ?void output(BE * b, A * a){cout << "AD:BE" << endl;b->output(a);}
            };

            int main()
            {
            ??? A * pAD = new AD;
            ??? pAD->output(new BE, pAD);
            ??? pAD->output(new B, pAD);

            cout<<endl;

            ??? A * pA = new A;
            ??? pA->output(new BE, pA);
            ??? pA->output(new B, pA);
            ?
            ?return 0;
            }

            Feedback

            # re: c++只支持單分派(single dispatch) 探討2  回復(fù)  更多評(píng)論   

            2007-03-13 13:28 by netdigger
            class BE : public B
            {
            public:
            void output(A * a){cout << "BE:A" << endl;}
            void output(AD * ad){cout << "BE:AD" << endl;}
            };

            當(dāng)你呼叫b->output(a)時(shí),由A的類型決定,而A的類型又由上一層virtual output(B * b, A * a)決定,所以他只能調(diào)用output(A * a)

            但是用this后,這個(gè)傳遞進(jìn)去就是類對(duì)像本身的類型,所以能得到你想要得到的結(jié)果.
            兩個(gè)程序都沒有錯(cuò),錯(cuò)在你對(duì)函數(shù)的重載理解上..

            # re: c++只支持單分派(single dispatch) 探討2  回復(fù)  更多評(píng)論   

            2007-03-13 14:36 by 小熊
            不是很明白你的意思哦。
            我覺得問題出在了,output(A * a)的時(shí)候,它被靜態(tài)綁定到了A類型,而不是動(dòng)態(tài)得runtime的得到它自己的類型哦。如果c++中能夠動(dòng)態(tài)的決定參數(shù)的類型的話,那么它應(yīng)該調(diào)用的是output(AD * ad), 而不是output(A * a).
            久久99精品国产99久久6| 久久久久久国产精品美女| 久久人人爽人人爽人人片AV不| 99蜜桃臀久久久欧美精品网站| 久久久精品2019免费观看| 99久久国产热无码精品免费久久久久 | 99国产精品久久| 久久久久这里只有精品| 亚洲午夜久久久久久久久久| 99久久国语露脸精品国产| 久久国产精品波多野结衣AV| 无码人妻精品一区二区三区久久 | 亚洲综合久久夜AV | 国产情侣久久久久aⅴ免费| 久久九色综合九色99伊人| 亚洲伊人久久精品影院| 久久久久亚洲av毛片大| AAA级久久久精品无码片| 亚洲国产成人精品91久久久| 国产精品视频久久| 久久久久99精品成人片试看| 一级A毛片免费观看久久精品| 国产99久久精品一区二区| 久久久久久久久久久精品尤物| 国产亚洲色婷婷久久99精品91| 99久久免费国产精精品| 久久婷婷色综合一区二区| 理论片午午伦夜理片久久| 国产精品99久久久久久宅男| 国产精品久久久天天影视| 久久久女人与动物群交毛片| 综合久久国产九一剧情麻豆| 三级三级久久三级久久| 久久av高潮av无码av喷吹| 91精品无码久久久久久五月天 | 9999国产精品欧美久久久久久| 精品国产VA久久久久久久冰| 亚洲中文字幕久久精品无码喷水 | 国产ww久久久久久久久久| 久久免费小视频| 国产精品99久久久久久猫咪 |