1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>                                                             
using  namespace  std;
#include <typeinfo>
class  A{
     public :
         virtual  void  foo( void ){}
};
class  B: public  A{
     void  foo( void ){}
};
 
class  C: public  A{
     void  foo( void  ){} 
};
 
int  main( void ){
     B b;
     A* pa= &b; 
     B* pb =  dynamic_cast <B*>(pa); //pa是指向B类型的基类指针,OK
     //C* pc = dynamic_cast<B*>(pa); //pa不是指向C类型的基类指针,error
 
     B b1; 
     A& ra = b1;
     B& b2 =  dynamic_cast <B&>(ra);
     //C& c1 = dynamic_cast<C&>(ra);error
     return  0;
}                                                                               
  
  上面两个错误都是,编译时不报错,运行时报错.
dynamic_cast 主要是将指向子类的基类指针转化为子类的指针
转换过程中会检查目标和期望转换的对象是否一致,一致转换
成功,否则失败,如果转换为指针,则失败返回NULL,如果是引用失败
返回bad_cast异常