第八章 继承

继承:在已有类的基础上创建新的类的过程
(一个B类继承A类,或从类A派生类B,类A称为基类,类B成为子类或派生类


类继承关系的语法形式:

class 派生类名:基类名表

{

        数据成员和成员函数

};

基类名表 构成:访问控制  基类名1访问控制  基类名2,访问控制  基类名n

访问控制表示派生类对基类的继承方式,使用关键字:

   public  公有继承

   private    私有继承

   protected  保护继承

注意:

不论种方式继承基类,派生类都不能直接使用基类的私有成员

派生类的生成过程经历了三个步骤:

       ●吸收基类成员(全部吸收(构造、析构除外),但不一定可见

       ●改造基类成员

        ●添加派生类新成员

改造基类成员:

通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏) 在派生类中不起作用的部分基类成员。
添加新成员:
仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。


重名成员:

派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽( hide)了基类的同名成员
在派生类中使用基类的同名成员,显式地使用类名限定符:

类名:: 成员


派生类中访问静态成员:
基类定义的静态成员,将被所有派生类共享(基类和派生类共享基类中的静态成员)
根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质
派生类中访问静态成员,用以下形式显式说明:

  类名:: 成员

或通过对象访问  对象名 . 成员

#include<iostream>

usingnamespace std;

classB

{public:

    static void Add() { i++ ; }

    static inti;

  void out() { cout<<"statici="<<i<<endl; }

};
intB::i=0;
classD : private B
{
public:   
void f()

{   
    i=5;
   Add();
   B::i++;
B::Add();

}

};

int main()
{ B x;  D y;
  x.Add();
  x.out();
  y.f();
  cout<<"static i="<<B::i<<endl;
  cout<<"static i="<<x.i<<endl;
  cout<<"static i="<<y.i<<endl;
}

运行结果:static i=1 static i=8 static i=8

派生类构造函数和析构函数的使用原则
基类的构造函数和析构函数不能被继承
如果基类没有定义构造函数或有无参的构造函数, 派生类也可以不用定义构造函数
如果基类无无参的构造函数,派生类必须定义构造函数
如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造

派生类是否定义析构函数与所属的基类无关


派生类构造函数的定义:

      在C++中,派生类构造函数的一般格式为:

      派生类::派生类名(参数总表):基类名(参数表)
     {
             // 派生类新增成员的初始化语句
     }

     注意:这是基类有构造函数且含有参数时使用

派生类析构函数:

(1)当派生类中不含对象成员时
●在创建派生类对象时,构造函数的执行顺序是:基类的构造函数→派生类的构造函数;
●在撤消派生类对象时,析构函数的执行顺序是:派生类的析构函数→基类的析构函数。
(2)当派生类中含有对象成员时
●在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;

●在撤消派生类对象时,析构函数的执行顺序:派生类的析构函数→对象成员的析构函数→基类的析构函数。


多继承的派生类和访问:

多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员。
执行顺序与单继承构造函数情况类似。多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。

 一个派生类对象拥有多个直接或间接基类的成员。不同名成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加以识别。 

多继承方式下构造函数的执行顺序:
●先执行所有基类的构造函数
●再执行对象成员的构造函数

●最后执行派生类的构造函数

多继承的析构函数:

●析构函数名同样与类名相同,无返回值、无参数,而且其定义方式与基类中的析构函数的定义方式完全相同。
●功能是在派生类中对新增的有关成员进行必要的清理工作。

●析构函数的执行顺序与多继承方式下构造函数的执行顺序完全相反,首先对派生类新增的数据成员进行清理,再对派生类对象成员进行清理,最后才对基类继承来的成员进行清理。 

心得:在学习继承的过程中,知道了许多可以简便程序的方法,学会了继承以后;在写有联系的不同类的时候;拥有的相同的数据成员和函数可以通过继承来避免再次写一遍,这也避免了更多错误的产生

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值