一、私有/保护继承下的向上类型转换
示例:
图中蓝色、黄色代码均不允许使用,原因是在私有继承下,派生类和基类的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表示运行时
- 派生类向基类转换总是安全的,但基类向派生类转换的话不一定!
- 若转换成功,则返回的目标值非空,反之则为空
- 指针形式若失败可指向空,而引用由于必须绑定一个对象,若失败只能抛出异常。
- 最常用的是指针和引用两种形式。