<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ## 概述 - 多繼承時很容易產生命名沖突 - 為了解決多繼承時的命名沖突和冗余數據問題,C++ 提出了虛繼承,使得在派生類中只保留一份間接基類的成員。 bad <details> <summary> main.cpp</summary> ``` //間接基類A class A{ protected: int m_a; }; //直接基類B class B: public A{ protected: int m_b; }; //直接基類C class C: public A{ protected: int m_c; }; //派生類D class D: public B, public C{ public: void seta(int a){ m_a = a; } //命名沖突 void setb(int b){ m_b = b; } //正確 void setc(int c){ m_c = c; } //正確 void setd(int d){ m_d = d; } //正確 private: int m_d; }; int main(){ D d; return 0; } ``` </details> <br /> 第 25 行代碼試圖直接訪問成員變量 m\_a,結果發生了錯誤,因為類 B 和類 C 中都有成員變量 m\_a(從 A 類繼承而來),編譯器不知道選用哪一個,所以產生了歧義 good:使用虛繼承 <details> <summary> main.cpp</summary> ``` //間接基類A class A{ protected: int m_a; }; //直接基類B class B: virtual public A{ //虛繼承 protected: int m_b; }; //直接基類C class C: virtual public A{ //虛繼承 protected: int m_c; }; //派生類D class D: public B, public C{ public: void seta(int a){ m_a = a; } //正確 void setb(int b){ m_b = b; } //正確 void setc(int c){ m_c = c; } //正確 void setd(int d){ m_d = d; } //正確 private: int m_d; }; int main(){ D d; return 0; } ``` </details> <br /> 派生類 D 中就只保留了一份成員變量 m_a,直接訪問就不會再有歧義了 ## 結論 - 在實際開發中,位于中間層次的基類將其繼承聲明為虛繼承一般不會帶來什么問題。 - 通常情況下,使用虛繼承的類層次是由一個人或者一個項目組一次性設計完成的。對于一個獨立開發的類來說,很少需要基類中的某一個類是虛基類,況且新類的開發者也無法改變已經存在的類體系 不提倡在程序中使用多繼承,只有在比較簡單和不易出現二義性的情況或實在必要時才使用多繼承,能用單一繼承解決的問題就不要使用多繼承
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看