什么是继承与派生:
在C++中可重用性是通过“继承”这一机制来实现的,因此继承是C++的一个重要的组成部分。
声明派生类的一般形式为:
class 派生类名 : [继承方式] 基类名
{
派生类新增加的成员
};
派生类的构成:派生类中的成员包括从基类继承过来的成员和自己增加的成员两大部分。
基类成员在派生类成员的访问属性:
public继承方式:
private->不可访问,public->public,protected->protected。
private继承方式:
private->不可访问,public->private,protected->privated。
protected继承方式:
private->不可访问,public->protected,protected->protected。
private和protected继承方式的区别:在多级派生时protected继承可以使得基类的成员仍然可以在派生类中访问,而private继承不能。
派生类的构造函数和析构函数:
基类的构造函数是不能被继承到派生类的,因此对基类的初始化工作也要由派生类的构造函数承担。
派生类构造函数一般形式为:
派生类构造函数名( 参数表 ):基类构造函数名( 参数表 ),子对象名(参数表) //这里调用基类的构造函数
{ 派生类中新增数据成员初始化语句 }
派生类构造函数先调用基类构造函数,调用子对象构造函数,再执行派生类构造函数本身。
在派生类对象释放时,先执行派生类的析构函数,然后调用子对象的析构函数,再执行其基类的析构函数。
多重继承:
当一个派生类有两个或者多个基类派生类从两个或多个基类中继承所需要的属性,这种行为称为多重继承。
多重继承派生类的构造函数:
派生类构造函数名(总参数表):基类1构造函数(参数表),基类2构造函数(参数表)
{ 派生类中新增数据成员成员初始化语句 }
在派生类中基类的同名成员被屏蔽,成为不可见的,也就是说派生类新增加的同名成员覆盖了基类中的同名成员。
虚基类:使得在继承间接共同基类时只保留一份成员。
如果一个派生类有多个直接基类,而这些基类又有一个共同的基类,则在最终派生类中会保留该间接共同基类数据成员的多份同名成员。这使得存储空间占用过多,还使得访问这些成员时变得更困难。
声明虚基类的一般形式:
class 派生类名:virtual 继承方式 基类名
经过这样的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该基类一次,也就是说基类成员只保留一次。
*注意为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则任然会出现对基类的多次继承。
在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化。
example:
class A
{ A(int i){ } ...;}
class B: virtual public A //A作为B的虚基类
{ B(int n):A(n){} ...; }
class C: virtual public A //A作为C的虚基类
{ C(int n):A(n){} ...; }
class D: public B,public C
{ D(int n)
:A(n),B(n),C(n){} //对所有基类初始化
...; }
基类与派生类的转换:
1、只有公有派生类才是基类真正的子类型,它完整地继承了基类的功能。
2、派生类对象可以向基类对象赋值。且只能用子对象对其基类进行赋值,而不能用基类对其子对象赋值。同一基类的不同派生对象之间也不能赋值。因为基类或者其他派生对象中不包含 要用于赋值的派生类中的某些的成员。
3、派生类对象可以替代基类对象向基类对象的引用进行赋值或者初始化。
4、如果函数的参数是基类对象或者基类对象的引用,则相应的实参可以用子类对象。
5、指向基类对象的指针也可以指向派生类对象。但是只能访问派生类对像中的基类成员,而不能访问派生类增加的成员。
继承与组合:
在一个类中以另一个类的对象作为数据成员,称为类的组合。
通过继承建立了派生类与基类的关系,它是一种是的关系,如黑猫是猫,白描也是猫。
通过组合建立了成员类与组合类的关系,它们之间是有的关系,如教授有一个生日。