上行转换:子类指针转父类指针
下行转换:父类指针转子类指针
上行转换一定是安全的。即由子类指针转为父类指针。
下行转换可能会有问题。
1.
对于上图,A是父类:
① A*转B*:下行转换,使用dynamic_cast会得到null
即定义一个对象A*,然后使用dynamic_cast将其转换为B*。下同。
② B*转A*:上行转换,使用dynamic_cast会得到正确的指针
2.
对于上图,A是父类:
① A*转B1*:下行转换,使用dynamic_cast会得到null
② A*转B2*:下行转换,使用dynamic_cast会得到null
③ B1*转A*:上行转换,使用dynamic_cast会得到正确的指针
④ B2*转A*:上行转换,使用dynamic_cast会得到正确的指针
⑤ B1*转B2*:横向转换,使用dynamic_cast会得到null
3.
对于上图,A1,A2是父类:
① A1*转B*:下行转换,使用dynamic_cast会得到null
② A2*转B*:下行转换,使用dynamic_cast会得到null
③ B*转A1*:上行转换,使用dynamic_cast会得到正确的指针
④ B*转A2*:上行转换,使用dynamic_cast会得到正确的指针
⑤ A1*转A2*:横向转换,使用dynamic_cast会得到null
⑥ B*转A1*,再由A1*转A2*:虽然后期的A1*转A2*属于横向转换,但是由于原始指针是B*,所以使用dynamic_cast会得到正确的指针
4. 特殊情形:
① A*转void*:使用dynamic_cast会得到有值的指针,dynamic_cast认为一定是安全的
② void*转A*:使用dynamic_cast编译会报错,被转换的数据类型不能为void*
5. A与B是两个无关的类:
① A*转B*:使用dynamic_cast会得到null