使用dynamic_cast的一点心得

简介:
  C++程序员大多喜欢使用强制类型转换(我也是),尽管它是C遗留下来的,尽管它存在这样那样的缺点,但是你不能不承认它使用起来很方便,而且绝大多数情况下是不会产生问题的.极少数情况下可能会存在类型转换失败的情况,这时候就需要使用到dynamic_cast了,这里提到的"极少数情况"是这样的:如果有继承或多重继承的类对象,你在某些情况下得到某个对象的指针,而你又想将其转换为某个特定类型,但是由于C++中对象类型的多态性(它可以是多种类型),你又不能确定(在运行时)这么做一定会成功,此时可以使用dynamic_cast,充分利用C++的运行时检查机制.只是用语言描述太抽象了,举个例子吧.
 
  1. class A{...}; 
  2. class B:public A{...}; 
  3. class C:public B{...}; 
  4. void Fun1(B* pB) 
  5. A* pA  = (A*)pB; 
  6. C* pC  = (C*)pB; 
  7. ... 
  Fun1函数使用强制类型转换将pB转换为A*或C*,看出什么的问题了吗?
  如果这样调用Fun1:
                             Fun1(((B*)new C));
的确不会有问题,但如果是这样呢: 
                             Fun1(new B);
pC不会为NULL,能够想到使用pC指针时就程序就悲剧了.
更严重情况下,如果是这样: 
                             Fun1((B*)0X00005678);//0X00005678是一个随机值
pA,PC就不会是NULL,强制类型转换总是能够成功的,但使用这两个指针时程序肯定崩溃.当然你可以使用异常处理机制来处理这样的错误,不过这有点大才小用的感觉,最好能够找到一种能够检查出类型转换能否成功的办法.这时dynamic_cast就能大显身手了.
 
 
  1. A* pA  = dynamic_cast<A*>pB;// upcast. 
  2. if (NULL == pA){...} 
  3. C* pC  = dynamic_cast<C*>pB;// downcast. 
  4. 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.

 

 

 

 













本文转自jetyi51CTO博客,原文链接: http://blog.51cto.com/jetyi/671256,如需转载请自行联系原作者




相关文章
|
1月前
|
编译器 C语言 C++
类型转换const_cast/static_cast/dynamic_cast/reinterpret_cast
类型转换const_cast/static_cast/dynamic_cast/reinterpret_cast
28 0
|
5月前
|
安全 程序员 编译器
static_cast与dynamic_cast到底是什么?
该文讨论C++中`static_cast`和`dynamic_cast`在处理子类与父类指针转换的情况。总结如下: 1. `static_cast`父类转子类:可能不安全,但不会报错。 2. `static_cast`子类转父类:安全,无错误。 3. `dynamic_cast`父类转子类:若父类有虚函数,运行时检查,成功返回子类指针,失败则为`nullptr`。 4. `dynamic_cast`子类转父类:安全,无错误。
|
6月前
|
安全 编译器 程序员
【C++入门到精通】C++类型的转换 | static_cast | reinterpret_cast | const_cast | dynamic_cast [ C++入门 ]
【C++入门到精通】C++类型的转换 | static_cast | reinterpret_cast | const_cast | dynamic_cast [ C++入门 ]
55 0
|
6月前
|
人工智能 安全 机器人
【C++】dynamic_cast基本用法(详细讲解)
【C++】dynamic_cast基本用法(详细讲解)
|
6月前
|
安全 编译器 C语言
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
83 0
|
6月前
|
C++
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
110 1
|
安全 C++
C++11之强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)
C++11之强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)
115 0
|
安全 C++ 编译器
static_cast, dynamic_cast, const_cast探讨
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 何时发生隐式类型转换 在下面这些情况下,编译器会自动地转换运算对象的类型: 在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型 在条件中,非布尔值转换为布尔类型 ...
1139 0