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

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

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 参数表)

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值