继承与派生

来源:互联网 发布:go语言并发编程实战 编辑:程序博客网 时间:2024/06/05 18:34

类的继承与派生:

v 保持已有类的特性而构造新类的过程称为继承。

v 在已有类的基础上新增自己的特性而产生新类的过程称为派生。

v 被继承的已有类称为基类(或父类)。

v 派生出的新类称为派生类。

继承派生的目的:

Ø 继承的目的:实现代码重用。

Ø 派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。

派生类的声明:

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

{

        成员声明;

}

Ø 继承方式:

n 不同继承方式的影响主要体现在:

u 派生类成员对基类成员的访问权限

u 通过派生类对象对基类成员的访问权限

n 三种继承方式

① 公有继承:

Ø 基类的publicprotected成员的访问属性在派生类中保持不变,但基类的private派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。

Ø 成员不可直接访问。

Ø 通过派生类的对象只能访问基类的public成员.

② 私有继承:

Ø 基类的publicprotected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。

Ø 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。

Ø 通过派生类的对象不能直接访问基类中的任何成员。

③ 保护继承:

Ø 基类的publicprotected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。

Ø 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。

Ø 通过派生类的对象不能直接访问基类中的任何成员

类型兼容新规则:一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。

 

类成员的访问控制:

单继承与多继承:

基类与派生类的对应关系:

单继承

派生类只从一个基类派生。

多继承

派生类从多个基类派生。

多重派生

由一个基类派生出多个不同的派生类。

多层派生

派生类又作为基类,继续派生新的类。

多继承时派生类的声明:

class 派生类名:继承方式1  基类名1
继承方式2  基类名2...

{

        成员声明;

}

注意:每一个“继承方式”,只用于限制对紧随其后之基类的继承。

 

派生类的构造、析构函数:

继承时的构造函数:

v 基类的构造函数不被继承,派生类中需要声明自己的构造函数。

v 定义构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。

v 派生类的构造函数需要给基类的构造函数传递参数

单一继承时的构造函数:

派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名(参数表)

{

本类成员初始化赋值语句;

}

派生类与基类的构造函数:

v 当基类中声明有缺省构造函数或未声明构造函数时,派生类构造函数可以不向基类构造函数传递参数,也可以不声明,构造派生类的对象时,基类的缺省构造函数将被调用。

v 当需要执行基类中带形参的构造函数来初始化基类数据时,派生类构造函数应在初始化列表中为基类构造函数提供参数。

构造函数的执行顺序:

1.调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。

2.对成员进行初始化,初始化顺序按照它们在类中声明的顺序。

3.执行派生类的构造函数体中的内容。

继承时的析构函数:

v 析构函数也不被继承,派生类自行声明

v 声明方法与一般(无继承关系时)类的析构函数相同。

v 不需要显式地调用基类的析构函数,系统会自动隐式调用。

v 析构函数的调用次序与构造函数相反。

同名隐藏规则:

当派生类与基类中有相同成员时:

若未强行指名,则通过派生类对象使用的是派生类中的同名成员。

如要通过派生类对象访问基类中被隐藏的同名成员,应使用基类名限定。

虚基类:

v 虚基类的引入

n 用于有共同基类的场合

v 声明

virtual修饰说明基类
例:class B1:virtual public B

v 作用

主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题.

n 为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝

v 注意:

n 在第一级继承时就要将共同基类设计为虚基类。

 

原创粉丝点击