第九课
1,类的继承
·继承可以使得子类具有父类的属性和仿佛或者重新定义、追加属性和方法;
2,继承相关概念
·继承是类之间定义的一种重要关系;
·一个B类继承A类,或者说从A类派生B类;
·那么A类称为基类,B类称为派生类(子类);
3,派生类的定义
·类继承关系的语法:
class 派生类名:基类名列表
{
//成员变量和成员函数声明;
}
·基类名列表:
访问限定符 基类名1,访问限定符 基类名2…
·访问限定符表示派生类对基类的继承方式,使用关键字:
·public 公有继承
·private 私有继承
·protected 保护继承
·派生类继承了基类的全部成员变量和成员方法(除了构造和析构之外的成员方法),但是这些成员的访问属性,在派生过程中是可以调整的;
4,继承重要说明
1,子类拥有父类的所有成员变量和成员函数;
2,子类可以拥有父类没有的方法和属性;
3,子类就是一种特殊的父类;
4,子类对象可以当作父类对象使用;
5,派生类的访问控制
·不同的继承方式会改变继承成员的访问属性
1,public继承 : 父类成员在子类中保持原有访问级别;
2,private继承: 父类成员在子类中变为private成员;
3,protected继承:
父类中public成员会变成protected;
父类中protected成员仍然为protected;
父类中private成员仍然为private;
6,继承属性访问表
·private成员在子类中仍然存在,但是却无法访问到,不论哪种方式继承,派生类都不能直接使用基类的私有成员;
如表格:
继承方式 | 基类的public成员 | 基类的protected成员 | 基类的private成员 |
---|---|---|---|
public | 子类为public | 子类为protected | 不可见 |
protected | 子类为protected | 子类为protected | 不可见 |
private | 子类为private | 子类我private | 不可见 |
7,能否被访问、继承方式选择
1,判断成员是否能被访问:三看
·看调用语句,是写在子类的内部还是外部;
·看子类如何从父类继承的
·看父类访问级别
2,派生类类成员访问级别设置的原则
·需要被外界访问的成员直接设置为public;
·只能在当前类中访问的成员设置为private;
·只能在当前类与子类中访问的成员设置为protected,protected成员的访问权限介于public和private之间;
·一般情况下,均使用public继承方式;
8,继承中的构造和析构
1,在子类对象构造时,需要调用父类构造函数对其继承得来的成员进行初始化;
2,在子类对象析构时,需要调用父类析构函数对其继承得来的成员进行清理;
·继承中的构造和析构调用原则:
1,子类对象在创建时会首先调用父类的构造函数;
2,父类构造函数执行结束后,执行子类的构造函数;
3,当父类的构造函数有参数时,需要在子类的初始化列表中显示调用;
4,析构函数调用的先后顺序与构造函数相反;
9,类型兼容性原则
·类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代;
·通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员;
·公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决;
1,类型兼容规则中所指的替代包括以下情况:
·子类对象可以当作父类对象使用;
·子类对象可以直接赋值给父类对象;
·子类对象可以直接初始化父类对象;
·父类指针可以直接指向子类对象;
·父类引用可以直接引用子类对象;
2,在替代之后,派生类对象是可以作为基类的对象使用,但是只能使用从基类继承的成员;
3,类型兼容规则是多态性的重要基础之一;
10,继承中同名成员处理方法
1,当子类成员变量与父类成员变量同名时,子类依然从父类继承同名成员;
2,在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符)
11,继承中的static成员
1,基类定义的静态成员,将被所有派生类共享;
2,根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的的访问性质;(遵守派生类的访问控制);
3,派生类中访问静态成员,用以下形式:
类名::成员
或通过对象访问: 对象名.成员;