派生类的构造函数和析构函数和多继承中的二义性与虚函数

析构函数主要作用是对数据成员初始化。

1派生类的构造函数

派生类的构造函数定义的一般形式为:

派生类名::派生类名(基类所需形参,本类成员所需形参):基类1(基类1 参数表),基类2(基类2 参数表),···,基类n(基类n 参数表),对象成员1(对象1 参数表),对象成员2(对象2 参数表),···,对象成员m(对象m 参数表){

                       //本类基本类型数据成员初始化

}

如果使用基类无参构造函数,派生类构造函数形参表中不包含供给基类构造函数的参数。此时,系统会调用基类的默认构造函数。如果使用对象数据成员的无参构造函数,派生类构造函数形参表中不包含初始化对象数据成员的参数。

2派生类的析构函数

派生类不能继承基类的析构函数,需要自己定义析构函数,以便在派生类对象消亡之前进行必要处理。派生类的析构函数只负责清理它新定义的非对象数据成员,对象数据成员由对象所属类的析构函数负责析构,基类的清理工作由基类的析构函数负责。

4多继承中的二义性与虚函数

4.1多继承的二义性

例,基类base的成员(数据成员和成员函数),要被继承到Fderiver1Fderiver2,然后又被继承到派生类Sderiver。在派生类Sderiver中,基类base的成员有两份拷贝(在Fderiver1Fderiver2中)。因此,通过派生类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 参数表)

在包含虚基类的继承结构中,系统在建立派生类的对象时,调用构造函数的顺序如下。

①按照虚拟基类被继承的顺序,调用它的构造函数。

②按照非虚拟基类被继承的顺序,调用它的构造函数。

③按照对象数据成员声明的顺序,调用它的构造函数。

④执行派生类自己的构造函数。

猜你喜欢

转载自blog.csdn.net/l15738519366/article/details/51347037