dynamic_cast<type>expresssion其中type必须是指针或者引用,通过dynamic_cast将基类指针转换为子类指针时,如果基类指针确实指向子类,那么dynamic_cast转换后传回相应类型地址,如果子类指针指向子类内存或者其他子类的内存,通过dynamic_cast转换之后传回NULL;

classB/classA:publicB/classC:publicB

B*pb=newA;

A*pA=dynamic_cast<A*>pb//返回A类型地址

C*pC=dynamic_cast<C*>pb//返回NULL

C*pC=static_cast<C*>pb//转换成功,但是破坏数据结构

C*pC=newC;

A*pA=dynamic_cast<A*>pC//返回空;

A*pA=static_cast<A*>pC//编译失败

对于多层继承

classBase/classBase1/classA:publicBase,publicBase1

Base*pBase=newA;

A*pA=dynamic_cast<A*>pBase;//返回相应类型地址

A*pA=static_cast<A*>pBase;//OK

Base1*pBase1=dynamic_casr<Base1*>pBase;//OK

Base1*pBase1=static_casr<Base1*>pBase;//编译失败

1、dynamic_cast:运行时检查,用于多态的类型转换(upcast,downcast和crosscast),只能转换指针和引用。
2、static_cast:编译时检查,用于非多态的转换,可以转换指针及其他,比如:int->float还可以逆隐式转换,比如:int->char

注意:使用dynamic_cast转换成子类时,基类中必须有虚函数,才不会报错,否则编译失败(因为dynamic_cast是运行时检查类型,而这个类型信息存储在虚函数表中),使用static_cast转换时,即使基类没有虚函数,编译也不会报错。