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

            大龍的博客

            常用鏈接

            統計

            最新評論

            轉:C++對象模型 多重繼承與虛函數表

            一 多重繼承

            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的編譯選項查看布局:

            4)可視化表示:

            5)代碼驗證:

            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) 驗證代碼運行結果:

            7)總結:

            與單繼承相同的是所有的虛函數都包含在虛函數表中,所不同的多重繼承有多個虛函數表,當子類對父類的虛函數有重寫時,子類的函數覆蓋父類的函數在對應的虛函數位置,當子類有新的虛函數時,這些虛函數被加在第一個虛函數表的后面。

            二 多重繼承運行時類型轉化

            1)代碼驗證:

            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)驗證代碼的運行結果:

            3)總結:

            從多重繼承的內存布局,我們可以看到子類新加入的虛函數被加到了第一個基類的虛函數表,所以當dynamic_cast的時候,子類和第一個基類的地址相同,不需要移動指針,但是當dynamic_cast到其他的父類的時候,需要做相應的指針的移動。

            三 完!

            感謝,Thanks!
            作者:iTech
            出處:http://itech.cnblogs.com/
            轉載:本文版權歸作者iTech所有,轉載請注明出處,不得用于商業用途!

            C++對象模型系列:

            本系列是主要是作者經驗的總結且同時參考了大量的網絡文章,希望能夠給C++的學習者有所幫助,但是由于作者水平有限,難免有錯,希望大家能夠指出,我將虛心地向大家學習,與大家共同進步!本系列的開發環境是Windows 32+VS2008。

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

            狠狠干狠狠久久| 国产欧美一区二区久久| 青青久久精品国产免费看| 亚洲欧美日韩精品久久亚洲区| 久久精品青青草原伊人| 无码人妻久久一区二区三区免费丨 | 伊人久久大香线焦AV综合影院| 亚洲av伊人久久综合密臀性色 | 69久久精品无码一区二区| 99久久精品免费观看国产| 久久精品国产精品亚洲精品| 66精品综合久久久久久久| 区久久AAA片69亚洲| 18岁日韩内射颜射午夜久久成人 | 99久久国产综合精品网成人影院| 国产成人久久精品二区三区| 伊人久久综合成人网| 人妻丰满?V无码久久不卡| 99精品久久久久中文字幕| 国产精品久久新婚兰兰| 国产免费久久精品丫丫| 99999久久久久久亚洲| 亚洲综合日韩久久成人AV| 精品人妻伦九区久久AAA片69| 91精品国产91久久久久福利| 一本色道久久99一综合| 亚洲欧洲久久av| 中文字幕久久亚洲一区| 久久久久国色AV免费观看| 精品国产热久久久福利| 精品国产综合区久久久久久 | 久久伊人五月天论坛| 伊人久久综合热线大杳蕉下载| 久久久久久亚洲AV无码专区| 少妇精品久久久一区二区三区| 亚洲色婷婷综合久久| 久久九九兔免费精品6| 一本一道久久综合狠狠老 | 久久久亚洲AV波多野结衣| 一级a性色生活片久久无| 久久久亚洲AV波多野结衣|