dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。类层次间进行上下行转换时,dynamic_cast和static_cast的效果时一样的;在进行下行转换时,dynamic_cast具有类型检查功能,比static_cast安全。
class Base
{
public:
int m_iNum;
vitual void foo();
};
class Derived :public Base
{
public:
char*m_szName[100];
}
void fun(Base* pb)
{
Derived *pb1=static_cast<Derived*>(pb);
Derived *pb2=dynamic_cast<Derived*>(pb);
如果pb实际指向一个Derived类型的对象,pb1和pd2一样,并且两个指针执行Derived类型的任何操作都是安全的。
如果pb实际指向的是一个Base类型的对象,那么pd1将是一个指向该对象的指针,对它进行Derived类型的操作是不安全的,而pd2将是一个空指针(即0,因为dynamic_cast失效)。
另外,Base要有虚函数,否则会出错;static_cast则没有这个限制。这是由于运行类型检查需要运行时类型信息,而这个信息存储在虚函数表中,只有定义了虚函数的类才有虚函数表,没有定义虚函数表的类是没有虚函数表的。
且dynamic还支持交叉转换(不同子类之间的转换),结构是空指针。