C++派生类向基类的类型转换

本篇主要参考《C++ Primer 第5版》,为什么派生类能向基类进行类型转换。

1. 派生类向基类的类型转换

C++ Primer P530
在这里插入图片描述

1.派生类对象中含有与其基类对应的组成部分,所以我们能把派生类的对象当成基类对象来使用,而且我们也能将基类的指针或引用绑定到派生类对象中的基类部分上。编译器会隐式地执行派生类到基类的转换。
2.为什么能把基类的指针或引用绑定到派生类对象中的基类部分上?因为派生类对象中含有基类的组成部分,所以可以用基类类型的指针指向派生类对象中的基类部分,安全地访问基类部分的成员。由于引用的内部实现也是指针,因此,基类的指针或引用绑定一个派生类对象是编译器允许的,编译器会隐式地执行派生类到基类的类型转换。

2. 类型转换与继承

C++ Primer P534
在这里插入图片描述

1.正是由于派生类中含有基类部分,才可以使用基类的指针或引用绑定一个派生类对象;而且,使用基类的指针或引用绑定一个基类对象也是毫无疑问的。
2.因此,当变量的静态类型是基类指针或引用时,其动态类型可能是基类对象,也可能是派生类对象。当调用的是虚函数时,就存在动态绑定,也就有了多态性。

在这里插入图片描述

3. 对象之间不存在类型转换

如前面所述,正是由于基类指针可以指向派生类对象中的基类部分,才可以用基类的指针或引用绑定派生类对象。因此,基类类型的变量(非指针非引用)是不能指向一个派生类对象的。

C++ Primer P534
在这里插入图片描述
在这里插入图片描述

1.Base基类中定义了默认构造函数,同时Base类的拷贝构造和拷贝赋值为删除的函数。
2.基类的指针或引用绑定到一个派生类对象,是编译器允许的,因为可以用基类指针指向派生类对象中的基类部分。可以看到,Base& rb = d1;是通过的。
3.因为对象之间不存在类型转换,所以我们无法用派生类对象构造一个基类对象(Base b1 = d1;),也无法用派生类对象赋值给一个基类对象(b = d1;)。

在这里插入图片描述

1.Base基类中定义了默认构造函数,同时Base类的拷贝构造和拷贝赋值为编译器默认合成的函数。
2.由于拷贝构造和拷贝赋值的函数形参是基类的const引用,因此,当拷贝构造或拷贝赋值的右侧对象是一个派生类对象时(Base b1 = d1; b = d1;),基类const引用形参可以绑定到派生类对象上;之后,基类的const引用参数,使用派生类实参的基类部分成员,逐一赋值给左侧对象(this指向的基类对象)的成员。
3.因此,派生类类型和基类类型之间是不存在类型转换的。派生类对象构造基类对象,或派生类对象赋值给基类对象,本质上是调用基类对象的拷贝构造和拷贝赋值函数,通过把基类引用形参绑定到派生类对象上,来完成函数调用的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值