• <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>
            隨筆-59  評論-36  文章-0  trackbacks-0
            問題1:
            class Base1
            {
            public:
                
            virtual void f()
                
            {
                    cout 
            << "Base1::f" << endl;
                }

                
            virtual void g()
                
            {
                    cout 
            << "Base1::g" << endl;
                }

            }
            ;
            class Base2 :public virtual Base1
            {
            public:

                
            virtual void f()
                
            {
                    cout 
            << "Base2::f" << endl;
                }

                
            virtual void g()
                
            {
                    cout 
            << "Base2::g" << endl;
                }

            }
            ;

            class Base3:public virtual Base1
            {
            public:

                
            virtual void f()
                
            {
                    cout 
            << "Base3::f" << endl;
                }

                
            virtual void g()
                
            {
                    cout 
            << "Base3::g" << endl;
                }

            }
            ;

            class Derive : public Base2, public Base3 {
            public:
            virtual void g() { cout << "Derive::g1" << endl; }
            }
            ;

            以上代碼是在論壇中遇見的,當時我并沒有立刻反應上來這是什么緣故,思索一陣后,才弄明白。
            原來,在Derive中沒有重寫f函數,又因為當派生類沒有重寫基類的虛函數時,派生類對象對該虛函數的調用,將會調用其基類中的版本,而Derive又是多繼承,于是在Derive繼承時就不知道Base1中的虛函數表應該記錄哪個版本的f函數,是Base2,還是Base3。
            因為Derive中已重定義g函數,Base1的虛函數表記錄的是Derive::g。

            ==============================================================================

            問題2:
            代碼來源<effective C++>2nd

            class Lottery
            {
            public:
              
            virtual int draw();
            };

            class GraphicalObject 
            {
            public:
              
            virtual int draw();
            };

            class LotterySimulation: public Lottery,
                                     
            public GraphicalObject 
            {
              
            // 沒有聲明draw
            };

            LotterySimulation 
            *pls = new LotterySimulation;

            pls
            ->draw();   // 錯誤! ---- 二義

            因為LotterySimulation中存在兩個名為draw的函數,于是調用存在二義性。同時,即便更改其中一個draw的訪問性也不能避免這種二義性,因為改變一個類成員的訪問權限不應該改變程序的含義。
            對于如下代碼,仍然存在二義性
            class SpecialLotterySimulation: public LotterySimulation 
            {
            public:
              
            virtual int draw();
            };

            pls 
            = new SpecialLotterySimulation;

            pls
            ->draw();     // 錯誤!  還是有二義
            因為,pls的靜態類型是LotterySimulation,而名字的查找是向上進行的,所以即便SpecialLotterySimulation中定義了一個draw,對pls來說他是不會查看SpecialLotterySimilation中的名稱的。
            posted on 2009-10-28 12:51 zhaoyg 閱讀(1139) 評論(0)  編輯 收藏 引用 所屬分類: C/C++學習筆記
            一本大道久久东京热无码AV | 777久久精品一区二区三区无码| 亚洲va久久久噜噜噜久久天堂| 人人狠狠综合久久88成人| 久久久久免费看成人影片| 青青草原1769久久免费播放| 日韩电影久久久被窝网| 久久精品国产99久久无毒不卡| 久久精品国产精品国产精品污| 色综合久久中文字幕综合网 | 狠狠色丁香婷婷综合久久来来去| 久久综合鬼色88久久精品综合自在自线噜噜| 一级做a爰片久久毛片毛片| 99re久久精品国产首页2020| 久久人人爽人人精品视频| 久久91精品久久91综合| 久久精品一本到99热免费| 91久久香蕉国产熟女线看| 久久影院综合精品| 亚洲а∨天堂久久精品9966| 国产精品久久久久aaaa| 国产亚洲精久久久久久无码77777| 久久99国产精品成人欧美| 日韩精品久久久肉伦网站| 久久精品青青草原伊人| 欧美午夜A∨大片久久| 久久e热在这里只有国产中文精品99| 久久精品水蜜桃av综合天堂| 精品综合久久久久久97| 久久笫一福利免费导航 | 欧美久久久久久| 中文精品久久久久人妻| 蜜臀久久99精品久久久久久| 国产亚洲精久久久久久无码AV| 日韩亚洲欧美久久久www综合网| 国内精品久久久久久99蜜桃| 亚洲精品国精品久久99热一| 久久久久久久女国产乱让韩| 伊人久久大香线蕉综合影院首页| 久久人人爽人人爽人人片AV不| 亚洲国产日韩欧美综合久久|