析构函数主要作用是对数据成员初始化。
1派生类的构造函数
派生类的构造函数定义的一般形式为:
派生类名::派生类名(基类所需形参,本类成员所需形参):基类1(基类1
参数表),基类2(基类2
参数表),···,基类n(基类n
参数表),对象成员1(对象1
参数表),对象成员2(对象2
参数表),···,对象成员m(对象m
参数表){
//本类基本类型数据成员初始化
}
如果使用基类无参构造函数,派生类构造函数形参表中不包含供给基类构造函数的参数。此时,系统会调用基类的默认构造函数。如果使用对象数据成员的无参构造函数,派生类构造函数形参表中不包含初始化对象数据成员的参数。
2派生类的析构函数
派生类不能继承基类的析构函数,需要自己定义析构函数,以便在派生类对象消亡之前进行必要处理。派生类的析构函数只负责清理它新定义的非对象数据成员,对象数据成员由对象所属类的析构函数负责析构,基类的清理工作由基类的析构函数负责。
4多继承中的二义性与虚函数
4.1多继承的二义性
例,基类base的成员(数据成员和成员函数),要被继承到Fderiver1和Fderiver2,然后又被继承到派生类Sderiver。在派生类Sderiver中,基类base的成员有两份拷贝(在Fderiver1和Fderiver2中)。因此,通过派生类Sderiver的对象访问基类base的公有成员时,编译系统就不知道如何从两份拷贝中进行选取,只好给出“ambiguous”的错误信息,也就出现了二义性。
4.2虚基类
可以解决二义性问题。
将共同基类设置为虚基类的方法是,在定义第一级派生类时用关键字virtual修饰说明继承关系,其语法形式为
Class 派生类名:virtual
继承方式 基类名{
//···
};
对第二级派生类的构造函数要进行一下修改:
构造函数在类外:
派生类名::派生类名(基类所需形参,本类成员所需形参):基类(data):基类1(基类1
参数表),基类2(基类2
参数表),···,基类n(基类n
参数表),对象成员1(对象1
参数表),对象成员2(对象2
参数表),···,对象成员m(对象m
参数表)
构造函数在类内:
派生类名(基类所需形参,本类成员所需形参):基类(data):基类1(基类1
参数表),基类2(基类2
参数表),···,基类n(基类n
参数表),对象成员1(对象1
参数表),对象成员2(对象2
参数表),···,对象成员m(对象m
参数表)
在包含虚基类的继承结构中,系统在建立派生类的对象时,调用构造函数的顺序如下。
①按照虚拟基类被继承的顺序,调用它的构造函数。
②按照非虚拟基类被继承的顺序,调用它的构造函数。
③按照对象数据成员声明的顺序,调用它的构造函数。
④执行派生类自己的构造函数。