继承《一》

来源:互联网 发布:qq假红包软件 编辑:程序博客网 时间:2024/05/26 09:57

继承的概念:

    继承是面向对象程序设计使代码可以复用的最重要的手段,它容许程序员在保持原有类型特性的基础上进行扩展,增加功能。这样产生的类叫新生的类,叫派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知程度。

   继承的定义格式:


他们在内存中的布局如图所示:说明他们有两个作用域


而继承方式有三种,分别是:public(公有继承),protected(保护继承),private(私有继承)。

切记:

1,基类的私有成员在派生类中是不能被访问的,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,那么继承方式就定义为公有继承(protected)

2,public继承是一个接口继承,保持is-a原则。

3,不管是哪种继承方式,在派生类中都可以访问基类的公有成员和保护成员,基类的私有成员存在但在子类中不能访问。

4,使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public。


我们假设有两种情况,a,在D类中包含了B类。b,在D类中私有继承了B类。那么现在如果在B类中有一个保护的成员-b,那么在情况a中是不可以访问的,但是在情况b中是可以访问的。



派生类中的构造函数和析构函数:

 如下面的简单程序:

#include<iostream>using namespace std;class B{public:B(){cout << "B()" << endl;}~B(){cout << "~B()" << endl;}};class D :public B{public:D(){cout << "D()" << endl;}~D(){cout << "~D()" << endl;}};void Funtest(){D d;}int main(){Funtest();return 0;}
输出的结果如图所示:


这说明函数的执行次序和函数的调用次数是不一样的,函数的执行次序是:基类构造函数->派生类中对象构造函数->派生类构造函数体。而函数的调用次序是:当程序走到D()时,走到初始化列表时程序来到B(),当B()结构体运行完了以后再来到D()的结构体,也就是说先构造属于B()的构造函数,再构造D()自己的结构函数,然后再析构~D,~B。换句话说,D()有一个隐藏的缺省参数:B()

友元与继承:

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

继承与转换

   派生类的值可以附给基类,基类的指针可以指向派生类,反之不行

多继承:

如下程序:

#include<iostream>using namespace std;class B1{public:int _b1;};class B2{public:    int _b2;};class C :public B1, public B2{public:int _d;};int main(){int a, b;return 0;}

有两个派生类,它们在内存中的布局:


而如果把继承的两个类反过来,那么它们在内存中的布局也会反过来。

0 0