1.static_cast在编译时期强制转换,dynamic_cast在运行时期转换(较安全)  
   

2.static_cast是c语言的强制转换代替品;dynamic_cast会运行时检查该转换是否类型安全,只在多态类型时合法,即该类至少具有一个虚拟方法。


其中static_cast是相当于C的强制类型转换,用起来可能有一点危险。dynamic_cast在转换前会检查指针(或引用)所指向对象的实际类型是否与转换的目的类型兼容,如果兼容转换才会发生,才能得到派生类的指针(或引用),否则:如果执行的是指针类型的转换引用,会得到空指针;如果执行的是用引用类型的转换,会抛出异常。


3.dynamic_cast可以转换指针和和引用(基类到派生类),不能用来转换对象。 而static_cast可以转换对象。


4.在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。


"类层次间安全的向下转换",它通过C++的dynamic_cast运算符来实现。当对一个指针使用dynamic_cast时,先尝试转换,如果成功(即,指针的动态类型(见条款38)和正被转换的类型一致),就返回新类型的合法指针;如果dynamic_cast失败,返回空指针。 



5.
dynamic_cast是试探映射,如dynamic_cast<A>*pB意思是“我希望它是A*,并打算要求它是”。它通常被称为类层次的动态导航。

  
   
而static_cast通常可用于类层次的静态导航,无映射变换,窄化变换(会丢失信息)等等,static_cast的应用要广一些,但如前所提到的,在类层次导航变换中我们应该使用前者,因为后者static_cast可能意味着冒险(比如变换时类似于强制转换一样丢失信息)。但是在一个类层次中没有虚函数或者我们确定有其他允许我们安全向下映射的信息则后者static_cast更快一些。