C++第五篇继承与派生

派生类将继承它所有基类中除构造函数和析构函数之外所有成员,因此派生类必须负责调用基类构造函数


  • 对基类成员和成员对象的初始化必须在成员初始化列表中进行
  • 派生类只用负责其直接基类的构造

多继承二义性

  • 不同基类相同成员
    class Base1{public:void fun(){}}; class Base2{public:void fun(){}}; class Derived : public Base1,public Base2{}; int main(){ Derived obj; obj.fun(); //产生二义性 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; //产生二义性,两个父类有共同的父类(本类的祖父类) obj.A::a = 1; //obj.A::a这种形式是错误的 obj.B1::a = 1; //这种形式是对的 return 0; }

虚基类

为了解决一个祖父类,在其孙类中可能产生的二义性(上面第二种情况)
class 派生类名 : virtual 继承方式 基类名{};

  • 虚基类需要特别注意构造函数,在孙类中需要对祖父类(虚基类)进行初始化(非虚基类只需初始化父类,不需要初始化祖父类),(例子省略)

//虚基类例子 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成员
私以为虚基类并无多大的用处,至少到现在为止我接触的C++项目中用到的很少,所以介绍并不详细。

你可能感兴趣的:(C++第五篇继承与派生)