类的继承与派生
一、 派生类生成过程
1.吸收基类成员。
2.改造基类成员。
3.扩充基类成员。
在类的派生中,构造函数和析构函数不能被派生。
派生类继承了基类的全部数据成员和除了构造,析构之外的全部函数、成员。
二、 类的继承方式有共有继承、保护继承、私有继承三种
1.公有继承。 基类的公有和保护成员的访问属性在派生类中不变,而基类的私有数据成员在派生类中不可访问。
2.私有继承。基类的公有保护成员以私有成员的身份出现在派生类中,而基类的私有成员不可访问。如果进一步派生的话,基类的全部成员就无法在新的派生类中被访问。实际上,相当于终止了基类功能的继续派生。
3.保护继承。基类的公有成员和保护成员以保护成员的身份出现在派生类中,而基类的私有成员不可访问。
三、 派生类的构造函数
构造派生类的对象时,就要对基类数据成员、新增数据成员和成员对象的数
据成员进行初始化。基类的构造函数并没有继承下来,因此,派生类的构造函数需要以合适的初始值作为参数,隐含调用基类和新增的内嵌对象成员的构造函数,来初始化它们各自的数据成员,然后再加入新的语句对新增普通数据成员进行初始化。
派生类构造函数的一般语法形式为:
派生类名::派生类名(参数总表):基类名1(参数表1),……基类名n(参数表n),内嵌对象名1(内嵌对象参数表1),……内嵌对象名2(内嵌对象参数表2)
{
派生类新增成员的初始化语句
}
注意:
1.基类名、对象名之间的次序无关紧要,它们各自出现的顺序可以是任意的。
2.对于使用默认构造函数的基类或对象,不需要写出类名(对象名)和参数表。
派生类构造函数的执行次序一般为:
1.调用基类的构造函数,按照它们被继承时声明的顺序。
2.调用内嵌成员对象的构造函数,按照它们的声明顺序。
3.派生类构造函数体中的内容。
四、 虚基类
当类的部分或全部直接基类是从另一个共同基类派生而来的,在这些基类中
从上一级共同基类继承来的成员就拥有相同的名称。在派生类的的对象中,这些同名数据成员在内存中同时拥有多个拷贝,同一个函数名会有多个映射。我们可以用作用域分辨符来唯一标识并分别访问它们,也可以将共同基类设置为虚基类,这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。
例如:类B0是类B1、B2的共同基类,类D由类B1、B2共同派生而来。则应如下定义:
Class B1: virtual public B0{…};
Class B2: virtual public B0{…};
Class D: public B1, public B2 { … };
五、 赋值兼容规则
指在需要基类对象的任何地方都可以使用派生类的对象来替代,包括以下三
种情况:
1.派生类的的对象可以赋值给基类对象。
2.派生类的对象可以初始化基类的引用。
3.派生类对象的地址可以赋给指向基类对象的指针。
在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继
承的成员。