类的继承和派生

本文详细介绍了面向对象编程中的类继承与派生机制,包括类的继承概念、派生类的定义、继承方式、成员访问权限、构造与析构函数、类型兼容规则以及虚基类的使用。重点讲解了派生类如何吸收基类成员、改造基类成员以及添加新成员,并阐述了成员的访问规则和构造函数的执行顺序。

一、类的继承与派生:

     1、类的继承是新的类从已有类那里得到已有的特性

     2、 从已有类产生新类的过程就是类的派生;

     3、类的继承与派生机制允许程序员在保持原有类特性的基础上,进行更具体,更详细的修改和扩充;

     4、由原有的类产生新类时,新类便包含了原有类的特征,同时也加入自己所特有的新特性。

二、派生类的定义:

   1、一般定义语法:

     class 派生类名:继承方式 基类名1,继承方式  基类名2……继承方式  基类名n

       {    派生类成员声明  }

继承方式:public  、   protected   、private;

  2、多继承:一个派生类,可以同时有多个基类;

        单继承:只有一个直接基类的情况;

        直接基类:在类族中,直接参与派生出某类的基类;

        间接基类:基类的基类甚至更高层的基类;

3、派生类过程:

    1)吸收基类成员

          将基类成员全盘接受,除基类中的构造函数和析构函数;

    2)改造基类成员

        如果派生类声明了一个和某基类成员同名的新成员(如果是成员函数,则参数表也要相同,参数表不同属于重载),派生的          新成员就隐藏了外层同名成员;

同名隐藏:在派生类中或者通过派生类的对象,直接使用成员名就只能访问到派生类中声明的同名成员;

    3)添加新的成员

4、类中成员的访问:

    public:在本类,派生类,类外都可以访问;

    protected:在本类,派生类可以访问;

    private:只能在本类访问;

三、继承方式:

1、 继承方式决定了基类成员在派生类中的最高访问权限;

2、派生类的访问:

1)如果派生类中声明了与基类成员函数同名放入新函数,即使函数的参数表不同,从基类的同名函数的所有重载形式也都会被           隐藏。若要访问被隐藏的成员,就需要使用作用域分辨符和基类名来限定;

2)对于多继承,首先考虑各个基类没有之间没有任何继承关系,同时也没有共同基类的情况。

      a、如果某派生类的多个基类拥有同名的成员,同时,派生类又新增这样的同名成员,在这种情况下,派生类成员将隐藏所有              基类的同名成员;使用“ 对象名.成员名 ”的访问方式,只能访问到派生类新增的成员;

      b、如果某个派生类的部分或全部直接基类是从另一个共同的基类派生而来,在这些直接基类中,从上一级基类继承来的成员             就拥有相同的名称,因此派生类中也就会产生同名现象,对这种类型的同名成员也要使用作用域分辨符来唯一标识,而且             必须用直接基类来进行限定;

四、派生类的构造和析构:

   1、派生类构造函数:

派生类的成员对象是由所有基类的成员对象与派生类新增的成员对象共同组成,因此构造派生类的对象时,就要对基类的成员对象和新增的成员对象进行初始化。

一般语法形式:

  派生类名::派生类名(参数表)

:基类名1(基类1初始化参数表),…基类名n(基类n初始化参数表),成员对象名m(成员对象 m初始化参数表)

{  派生类构造函数的其他初始化操作  }

派生类构造函数执行顺序:

 1)传参;

2)调用基类构造;

3)按照类中成员变量声明顺序,构造成员变量;

4)函数体。

2、派生类的析构函数:

 派生类的析构函数的功能是在该类对象消亡之前进行一些必要的清理工作。

     析构函数执行顺序:

1)函数体;

2)按照成员变量声明顺序逆序,依次析构成员变量;

3)基类析构函数。

五、类型兼容规则

类型兼容性规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代;

这里的替代包括以下情况:

   1)派生类的对象可以隐含转化为基类对象;

   2)派生类的对象可以初始化基类的引用;

   3)派生类的指针可以隐含转化我基类的指针;

在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。

六、虚基类

 当某类的部分或全部直接基类是从另一个共同基类派生而来时,在这些直接基类中从上一级共同基类继承来的成员就拥有相同的名称。在派生类的对象中,这些同名数据成员在内存中同时拥有多个副本,同一个函数名会有多个映射。可以使用作用域分辨符来唯一标识分别访问,也可以将共同基类设置为虚基类;

这时从不同路径继承过来的同名数据成员在内存中就只有一个副本,同一个函数名也只有一个映射。

虚基类的声明是在派生类的定义过程中进行的,语法为:

class 派生类名:virtual 继承方式  基类名;

构造一个类的对象的一般顺序:
   1)如果该类有直接或间接的虚基类,则先执行虚基类的构造函数;

   2)如果该类有其他基类,则按照他们在继承声明列表中出现的次序,分别执行它们的构造函数,但构造函数过程中,不再执行它们的虚基类的构造函数;

   3)按照在类定义中出现的顺序,对派生类中新增的成员对象进行初始化。对于类类型的成员对象,如果出现在构造函数初始化列表中,则以其中指定的参数执行构造函数,如未出现,则执行默认构造函数,对于基本数据类型的成员对象,如果出现在构造函数的初始化列表中,则使用其中指定的值为赋初值,否则什么也不做;

4)执行构造函数的函数体;

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值