C++继承[详细]

来源:互联网 发布:鲜活的数据 编辑:程序博客网 时间:2024/05/22 17:21

1.继承概念

所谓继承,就是在已有类上派生出新类(派生类或子类)保持原有类特性的基础上进行扩展,增加新功能,被继承的类叫做基类(或父类),产生的新类叫做派生类(或子类)。


2.继承定义格式

class 派生类名称:继承类型(public,protected,private)   基类(父类)名称

举例:

class Base{public:void show(){cout << "_a=" << _a << endl;cout << "_b=" << _b << endl;cout << "_a=" << _c << endl;}public:int _a;protected:int _b;private:int _c;};class Derived :public Base{public:void Derived_show(){cout << "_e=" << _e << endl;cout << "_f=" << _f << endl;cout << "_g=" << _g << endl;}public:int _e;protected:int _f;private:int _g;};

3.访问限定符


总结:

(1)公有继承实现的是一个接口继承,基类可用的成员派生类也可用。

(2)保护继承和私有继承是一个实现继承,基类的部分成员并非完全成为派生类接口的一部分。绝大多数场景中使用的是公有继承。

(3)基类的私有成员在派生类中不可访问保护继承可以使得基类成员能在派生类内访问,但不能在类外访问。由此可见,保护成员限定符是因继承才出现的。

(4)三种继承方式,都允许派生类内部访问基类公有成员和保护成员,基类的私有成员不允许访问,即不可见。

(5)关键字class默认的继承方式是private,关键字struct默认的继承方式是public,但是建议一般情况下将继承方式给出来。

4.派生类的默认成员函数


继承关系中构造函数的调用顺序:

派生类对象--->派生类构造函数列表--->基类构造函数--->派生类构造函数

继承关系中析构函数的调用顺序:

析构派生类对象--->派生类析构函数列表--->基类析构函数--->派生类析构函数

举个例子:

class Test1{public:Test1(int data){}~Test1(){}};class Test2{public:Test2(int data){}~Test2(){}};class Base1{public:Base1(int data) : _data(data){}~Base1(){}protected:int _data;};class Base2{public:Base2(int data) : _data2(data){}~Base2(){}protected:int _data2;};class Derive : public Base1, public Base2{public:        //Derive(): Base1(0), Base2(1),t1(3), t2(4)//按照顺序//Derive(): Base2(0), Base1(1),t2(3), t1(4)//B1-->构造函数-->B2--->//Derive(): t1(3), t2(4), Base1(0), Base2(1)Derive() : t2(3), t1(4), Base2(0), Base1(1){}~Derive(){}protected:Test1 t1;Test2 t2;};
构造函数调用顺序

1.Derive(): Base1(0), Base2(1),t1(3), t2(4)

派生类Derive构造函数列表--->基类Base1构造函数--->基类Base2构造函数--->派生类Derive构造函数--->t1构造函数--->派生类Derive构造函数--->t2构造函数--->派生类Derive构造函数

2.Derive(): Base2(0), Base1(1),t2(3), t1(4)
3.Derive(): t1(3), t2(4), Base1(0), Base2(1)

4.Derive() : t2(3), t1(4), Base2(0), Base1(1)

派生类Derive构造函数列表--->基类Base1构造函数--->派生类Derive构造函数--->基类Base2构造函数--->派生类Derive构造函数--->t1构造函数--->派生类Derive构造函数--->t2构造函数--->派生类Derive构造函数

5.继承体系中的作用域

(1)在继承体系中,基类和派生类是在两个不同的作用域

(2)派生类和基类中有相同的成员或成员函数,派生类成员将屏蔽基类对成员的访问,即同名隐藏。一般情况下,避免基类的成员和成员函数和派生类成员和成员函数相同。

6.赋值兼容规则(public继承)

(1)子类对象可以赋值给父类对象

(2)父类对象不可以赋值给子类对象

(3)父类的指针/引用可以指向子类对象

(4)子类的指针/引用不可以指向父类对象,但可以通过强制类型转换

7.友元函数&继承

友元关系不可以继承,即基类友元不能访问子类私有成员和保护成员。

8.静态成员&继承

基类中有一个静态成员,无论派生多少个子类,静态成员都是唯一的,不会发生改变。

9.继承方式

(1)单继承

class Base{public:int _a;};class D1 :public Base{public:int _c;};class D2 :public Base{public:int _d;};


(2)多继承

class B1{public:int _a;};class B2{public:int _b;};class D :public B1,public B2{public:int _c;};


(3)菱形继承

class B{public:int _a;};class C1 :public B{public:int _c;};class C2 :public B{public:int _d;};class D :public C1, public C2{private:int _e;};


(4)虚继承

解决二义性问题。

class Base{public:int _b;int _c;};class Derived :virtual public Base{public:int _d;};int main(){Derived b;b._b = 0;b._c = 1;b._d = 2;system("pause:");return 0;}

原创粉丝点击