1.派生类的初始化与释放
派生类默认构造函数初始化流程:
1.基类构造函数
2.派生类构造函数
释放流程:
1.派生类的析构函数
2.基类的析构函数。
当派生类存在子对象时构造函数的初始化流程:
1.基类的构造函数
2.子对象的构造函数
3.其他数据初始化
格式如下:
派生类构造函数名(总形式参数表列) : 基类构造函数名(实际参数表列),子对象名(实际参数表列)
{
派生类中新增数据成员初始化语句
}
多层派生:
Student(int n, string nam){... ...}
Student1(int n, string nam,int a): Student(n,nam){... ...}
Student2(int n, string nam, int a, int s): Student1(n,nam,a){... ...}
派生类构造函数的特殊形式
1.当不需要对派生类新增的成员进行任何初始化操作时,派生类构造函数的函数体可以为空。
这种派生类构造函数的作用只是为了将参数传递给基类构造函数和子对象,并在执行派生类构 造函数时调用基类构造函数和子对象构造函数。
2.基类中没有定义构造函数,或定义了没有参数的构造函数
在派生类构造函数中可不写调用基类构造函数的语句,调用派生类构造函数时系统会自动调用基类的默认构造函数。
3.基类或子对象类型的声明中定义了带参数的构造函数
必须显式地定义派生类构造函数,并在派生类构造函数中写出基类或子对象类型的构造函数及 其参数表。
4.基类中既定义无参数的构造函数,又重载了有参数的构造函数
派生类构造函数中可以调用带参数的基类构造函数,也可以不调用基类的构造函数。
2.继承
类的数据成员默认是私有的,继承的默认方式也是私有的。
访问属性:
1.基类的成员函数只能访问基类的成员,
不能访问派生类的成员
2.不同继承方式的访问属性如下图。
访问属性如下:
私有继承将原来基类中能被外界引用的成员隐藏起来,不让外界引用。不需再往下继承的类的功能,可用私有继承方式把它隐蔽起来。 由于私有派生类限制太多,使用不方便,一般不常使用。
3.多级派生
1.4种访问属性
公用的——类内和类外都可以访问
受保护的——类内可以访问,类外不能访问,下一层的派生类可以访问
私有的——类内可以访问,类外不能访问
不可访问的——类内和类外都不能访问
如果在多级派生时都采用公用继承方式,那么直到最后一级派生类都能访问基类的公用成员和保护成员。
如果采用私有继承方式,经过若干次派生之后,基类的所有的成员已经变成不可访问的了。
如果采用保护继承方式,在派生类外无法访问派生类中的任何成员;而且,经过多次派生后,人们很难清楚地记住哪些成员可以访问,哪些成员不能访问,很容易出错。
实际中,常用的是公用继承。
4.多重继承
一个派生类有两个或多个基类,派生类从两个或多个基类中继承所需的属性。C++为了适应这种情况,允许一个派生类同时继承多个基类。这种行为称为多重继承。
声明多重继承方法:
class A
{}
class B
{}
class C
{}
class D:public A,private B,protected C
{
//D中新增成员
D():A(), B(), C(){...}
}