C++第五篇繼承與派生

派生類將繼承它所有基類中除構(gòu)造函數(shù)和析構(gòu)函數(shù)之外所有成員,因此派生類必須負(fù)責(zé)調(diào)用基類構(gòu)造函數(shù)


  • 對基類成員和成員對象的初始化必須在成員初始化列表中進(jìn)行
  • 派生類只用負(fù)責(zé)其直接基類的構(gòu)造

多繼承二義性

  • 不同基類相同成員
    class Base1{public:void fun(){}}; class Base2{public:void fun(){}}; class Derived : public Base1,public Base2{}; int main(){ Derived obj; obj.fun(); //產(chǎn)生二義性 obj.Base1::fun(); //正解 return 0; }
  • 共同基類成員(共同祖父類)
    class A{ public: int a;}; class B1 : public A{ private: b1;}; class B2 : public A{ private: b2;}; class D : public B1,public B2{public: void fun(); private: int d;} int main(){ D obj; obj.a = 1; //產(chǎn)生二義性,兩個父類有共同的父類(本類的祖父類) obj.A::a = 1; //obj.A::a這種形式是錯誤的 obj.B1::a = 1; //這種形式是對的 return 0; }

虛基類

為了解決一個祖父類,在其孫類中可能產(chǎn)生的二義性(上面第二種情況)
class 派生類名 : virtual 繼承方式 基類名{};

  • 虛基類需要特別注意構(gòu)造函數(shù),在孫類中需要對祖父類(虛基類)進(jìn)行初始化(非虛基類只需初始化父類,不需要初始化祖父類),(例子省略)

//虛基類例子 class Base{}; class B1 : virtual public Base{}; class B2 : virtual public Base{}; class B3 : public Base{}; class Derived : public B1,public B2,public B3{};
所以Derived從B1,B2只繼承一份Base的成員,但是從B3將繼承另一份Base成員
私以為虛基類并無多大的用處,至少到現(xiàn)在為止我接觸的C++項目中用到的很少,所以介紹并不詳細(xì)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容