知识点总结
继承:在已有类的基础上创建新类的过程。
类之间关系
一个 B 类继承A类,或称从类 A 派生类 B,类 A 称为基类(父类),类 B 称为派生类(子类)。
基类和派生类
类继承关系的语法形式
class 派生类名 : 基类名表
{
数据成员和成员函数声明
};
基类名表 构成
访问控制 基类名1, 访问控制 基类名2 ,… , 访问控制 基类名n
访问控制 表示派生类对基类的继承方式,使用关键字:
public 公有继承
private 私有继承
protected 保护继承
派生类
派生类的生成过程经历了三个步骤:
1、吸收基类成员 (全部吸收(构造、析构除外),但不一定可见)在C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。
2、改造基类成员 通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基类成员。
3、添加派生类新成员 仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。
重名成员
1、派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽(hide)了基类的同名成员
2、在派生类中使用基类的同名成员,显式地使用类名限定符:
类名 :: 成员
派生类中访问静态成员
1、基类定义的静态成员,将被所有派生类共享(基类和派生类共享基类中的静态成员)
2、根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质
3、派生类中访问静态成员,用以下形式显式说明:
类名 :: 成员
或通过对象访问 对象名 . 成员
基类的初始化
1、在创建派生类对象时用指定参数调用基类的构造函数来初始化派生类继承基类的数据
2、派生类构造函数声明为
派生类构造函数 ( 变元表 ) : 基类 ( 变元表 ) , 对象成员1( 变元表 )
… 对象成员n ( 变元表 ) ;
3、构造函数执行顺序:基类—>对象成员—>派生类
派生类构造函数和析构函数的定义规则
派生类构造函数和析构函数的使用原则
1、基类的构造函数和析构函数不能被继承
2、如果基类没有定义构造函数或有无参的构造函数, 派生类也可以不用定义构造函数
3、如果基类无无参的构造函数,派生类必须定义构造函数
4、如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造
5、派生类是否定义析构函数与所属的基类无关
派生类的构造函数的定义
1、派生类的数据成员既包括基类的数据成员,也包括派生类新增数据成员。
2、在C++中,派生类构造函数的一般格式为:
派生类::派生类名(参数总表):基类名(参数表)
{
// 派生类新增成员的初始化语句
}
注意:这是基类有构造函数且含有参数时使用
派生类析构函数
1、当派生类中不含对象成员时
在创建派生类对象时,构造函数的执行顺序是:基类的构造函数→派生类的构造函数;
在撤消派生类对象时,析构函数的执行顺序是:派生类的析构函数→基类的析构函数。
2、当派生类中含有对象成员时
在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;
在撤消派生类对象时,析构函数的执行顺序:派生类的析构函数→对象成员的析构函数→基类的析构函数。
学习体会
继承能够使代码打的更加简洁。在使用类时省去了很多不必要的步骤。使用继承能够在一个大类中将许多派生类融合进去。在之后的程序设计中,可以尽量的使用继承。