- class A{...};
- class B:public A{...};
- class C:public B{...};
- void Fun1(B* pB)
- {
- A* pA = (A*)pB;
- C* pC = (C*)pB;
- ...
- }
- A* pA = dynamic_cast<A*>pB;// upcast.
- if (NULL == pA){...}
- C* pC = dynamic_cast<C*>pB;// downcast.
- if (NULL == pC){...}
dynamic_cast的具体作用这里不详细解释,仅仅抛砖引玉做一点说明.这里假设:
dynamic_cast < ObjectType-ID* > ( ObjectType*)
如果要成功地将ObjectType*转换为ObjectType-ID*,则必须存在这种可能性才可以,也就是说ObjectType*指向的对象要"包含"ObjectType-ID*指向的对象,如此才能够成功.就上面的例子来说,C对象"包含"B对象,而B对象"包含"A对象,如果:
A* pA = new B;
那么
B* pB = dynamic_cast<B*>pA;// OK.
C* pC = dynamic_cast<C*>pA;// Fail.
如果说你不能确定这种包含关系,最好使用dynamic_cast.
实际上可以把dynamic_cast看做是强制类型转换的一个子集,看成是更严格检查的强制类型转换,因为"更严格"所以能够检查出来错误.
最后提一点,使用dynamic_cast,不要忘了编译选项GR.
本文出自 “零一小筑” 博客,请务必保留此出处http://jetyi.blog.51cto.com/1460128/671256
联系客服