> 文章列表 > 继承下的类型转换

继承下的类型转换

继承下的类型转换

继承下的类型转换

一、私有/保护继承下的向上类型转换

继承下的类型转换
示例:
继承下的类型转换
图中蓝色、黄色代码均不允许使用,原因是在私有继承下,派生类和基类的public接口完全不搭界(所实现的功能没有重叠),因此不允许强制转换,也无任何意义。

二、公有继承下的向上类型转换

继承下的类型转换
(派生类更具化,基类更泛化、一般化)、(派生类的public行为集较基类功能更全)

具体转换形式:
继承下的类型转换

结论:应尽可能使用指针或引用形式进行向上类型转换

应用:以数据成员函数参数的形式存放基类。

  • 数据成员:关联基类及其任意派生类。
  • 函数参数:可以传入任意派生类。

示例:
继承下的类型转换

三、类型转换操作符

继承下的类型转换

1、

继承下的类型转换

(静态一般指编译期

2、

继承下的类型转换
继承下的类型转换
但上图这种操作方法建议慎重使用(违背了使用const的初衷)

补充:volatile关键字

常常用于多线程中,意为“易变的”。

示例:

继承下的类型转换
若类A的val未加volatile关键字修饰,则在A::Func1函数中编译器会将此三条语句优化为一条语句:val = 3;,且A::Func2函数的实现1会返回k的平方。但加了volatile关键字修饰之后则编译器不会优化,会将此三条语句全部保留。于是在执行完第一条语句val = 1后如果此时有别的线程访问val,则val的值为1。

同时在Func2函数的实现1中会去k的地址处找到k的值,然后再去此地址处找k的值并将其相乘。由于在多线程的情况下有可能k的值会被修改,因此Func2函数的返回值并不一定为k的平方。

反之,Func2函数的实现2则返回的是第一次找到k的值的平方,因为k的类型为int,无volatile修饰。

3、

继承下的类型转换
typedef那条语句中,FuncType表示函数类型名,其每个元素都表示一个函数,其中返回值为void,传入参数类型为void *

4、

继承下的类型转换

  • dynamic表示运行时
  • 派生类向基类转换总是安全的,但基类向派生类转换的话不一定!
  • 若转换成功,则返回的目标值非空,反之则为空
  • 指针形式若失败可指向空,而引用由于必须绑定一个对象,若失败只能抛出异常。
  • 最常用的是指针和引用两种形式。