天天看点

static_cast与dynamic_cast的区别

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