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

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            轉(zhuǎn):C++對(duì)象模型 多重繼承與虛函數(shù)表

            一 多重繼承

            1) 代碼:

            Code
            #include <iostream>
            using namespace std;
            class B1
            {
            public:
            int x;
            virtual void v1(){ cout << "B1::v1" << endl; }
            void f1(){cout << "B1::f1" << endl; }
            };
            class B2
            {
            public:
            int y;
            virtual void v2(){ cout << "B2::v2" << endl; }
            void f2(){ cout << "B2::f2" << endl; }
            };
            class B3
            {
            public:
            int z;
            virtual void v3(){ cout << "B3::v3" << endl; }
            void f3(){ cout << "B3::f3" << endl; }
            };
            class D : public B1, public B2, public B3
            {
            public:
            int a;
            void v3(){ cout << "D::v3" << endl; }
            virtual void vD(){ cout << "D::vD" << endl; }
            };

            2)類圖:

            3)VS2008的編譯選項(xiàng)查看布局:

            4)可視化表示:

            5)代碼驗(yàn)證:

            Code
            typedef void (*Fun)();
            void PrintMember(int *pI)
            {
                 cout << *pI << endl;
            }
            void PrintVT(int *pVT)
            {
            while(*pVT != NULL)
                 {
                     (*(Fun*)(pVT))();
                     pVT++;
                 }
            }
            void PrintVTAndMember(B1 *pD)
            {
            int *pRoot = (int*)pD;
            int *pVTB1 = (int*)*(pRoot + 0);PrintVT(pVTB1);
            int *pMB1 = pRoot +1; PrintMember(pMB1);
            int *pVTB2 = (int*)*(pRoot + 2);PrintVT(pVTB2);
            int *pMB2 = pRoot +3; PrintMember(pMB2);
            int *pVTB3 = (int*)*(pRoot + 4);PrintVT(pVTB3);
            int *pMB3 = pRoot +5; PrintMember(pMB3);
            }
            void TestVT()
            {
                 B1 *pB1 = new D();
                 D *pD = dynamic_cast<D*>(pB1);
                 pD->x = 10;
                 pD->y = 20;
                 pD->z = 30;
                 pD->a = 40;
                 PrintVTAndMember(pD);
                 delete pD;
            }

            6) 驗(yàn)證代碼運(yùn)行結(jié)果:

            7)總結(jié):

            與單繼承相同的是所有的虛函數(shù)都包含在虛函數(shù)表中,所不同的多重繼承有多個(gè)虛函數(shù)表,當(dāng)子類對(duì)父類的虛函數(shù)有重寫時(shí),子類的函數(shù)覆蓋父類的函數(shù)在對(duì)應(yīng)的虛函數(shù)位置,當(dāng)子類有新的虛函數(shù)時(shí),這些虛函數(shù)被加在第一個(gè)虛函數(shù)表的后面。

            二 多重繼承運(yùn)行時(shí)類型轉(zhuǎn)化

            1)代碼驗(yàn)證:

            Code
            void TestDynamicCast()
            {
                 B1 *pB1 = new D();
                 cout << "B1:" << pB1 << endl;
                 D *pD = dynamic_cast<D*>(pB1);
                 cout << "D:"<< pD << endl;
                 B2 *pB2 = dynamic_cast<B2*>(pB1);
                 cout << "B2:" << pB2 << endl;
                 B3 *pB3 = dynamic_cast<B3*>(pB1);
                 cout << "B3:" << pB3 << endl;
                 delete pD;
            }

            2)驗(yàn)證代碼的運(yùn)行結(jié)果:

            3)總結(jié):

            從多重繼承的內(nèi)存布局,我們可以看到子類新加入的虛函數(shù)被加到了第一個(gè)基類的虛函數(shù)表,所以當(dāng)dynamic_cast的時(shí)候,子類和第一個(gè)基類的地址相同,不需要移動(dòng)指針,但是當(dāng)dynamic_cast到其他的父類的時(shí)候,需要做相應(yīng)的指針的移動(dòng)。

            三 完!

            感謝,Thanks!
            作者:iTech
            出處:http://itech.cnblogs.com/
            轉(zhuǎn)載:本文版權(quán)歸作者iTech所有,轉(zhuǎn)載請(qǐng)注明出處,不得用于商業(yè)用途!

            C++對(duì)象模型系列:

            本系列是主要是作者經(jīng)驗(yàn)的總結(jié)且同時(shí)參考了大量的網(wǎng)絡(luò)文章,希望能夠給C++的學(xué)習(xí)者有所幫助,但是由于作者水平有限,難免有錯(cuò),希望大家能夠指出,我將虛心地向大家學(xué)習(xí),與大家共同進(jìn)步!本系列的開發(fā)環(huán)境是Windows 32+VS2008。

            posted on 2010-04-14 12:49 大龍 閱讀(307) 評(píng)論(0)  編輯 收藏 引用


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


            久久人妻少妇嫩草AV无码蜜桃| 色妞色综合久久夜夜| 久久精品无码一区二区app| 久久精品中文字幕有码| 综合人妻久久一区二区精品| 波多野结衣中文字幕久久| 久久久久国产精品三级网| 午夜精品久久久久久99热| 国产AV影片久久久久久| 久久免费看黄a级毛片| 婷婷综合久久狠狠色99h| 久久精品一区二区三区AV| 国产三级精品久久| 国产精品无码久久综合 | 亚洲国产成人久久综合野外| 国内精品久久久久久久97牛牛| 久久www免费人成看国产片| 久久精品国产亚洲av影院| 欧美日韩精品久久久久| 99久久综合国产精品二区| 久久综合给久久狠狠97色| 国产精品亚洲综合久久| 久久天天躁狠狠躁夜夜2020老熟妇 | 国内精品久久久久久99| 中文字幕亚洲综合久久菠萝蜜| 国产精品99久久久久久董美香 | 99久久免费只有精品国产| 亚洲香蕉网久久综合影视| 日韩电影久久久被窝网| 久久99精品久久久久久噜噜| 久久精品国产亚洲网站| A狠狠久久蜜臀婷色中文网| 久久亚洲中文字幕精品有坂深雪 | 国产精品久久午夜夜伦鲁鲁| 久久精品国产2020| 久久人人添人人爽添人人片牛牛| 久久这里有精品视频| 国产三级精品久久| 深夜久久AAAAA级毛片免费看| 久久亚洲中文字幕精品一区| 久久久久无码精品|