dynamic_cast:安全转换

上行转换:子类指针转父类指针

下行转换:父类指针转子类指针

上行转换一定是安全的。即由子类指针转为父类指针。

下行转换可能会有问题。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值