派生類將繼承它所有基類中除構(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ì)。