dynamic_cast < type-id > ( expression )
该运算符把 expression 转换成type-id类型的对象。Type-id必须是类的 指针 、类的引用或者 void *;
如果type-id是类 指针 类型,那么 expression 也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
dynamic_cast 运算符 可以在执行期决定真正的类型。如果downcast是安全的(也就说,如果基类 指针 或者引用确实指向一个 派生类 对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空 指针 (也就是说,基类指针或者引用没有指向一个 派生类 对象)。
dynamic_cast 主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时, dynamic_cast static_cast 的效果是一样的;
在进行下行转换时, dynamic_cast 具有类型检查的功能,比 static_cast 更安全。
class B{
public:
int m_iNum;
virtual void foo();
};
class D:public B{
public:
char *m_szName[100];
};
void func(B *pb){
D *pd1 = static_cast(pb);
D *pd2 = dynamic_cast(pb);
}
在上面的 代码段 中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个 指针 执行D类型的任何操作都是安全的;
但是,如果pb指向的是一个B类型的对象,那么pd1将是一个指向该对象的 指针 ,对它进行D类型的操作将是不安全的(如访问m_szName),
而pd2将是一个空 指针

DYNAMIC_DOWNCAST DYNAMIC_DOWNCAST( class, pointer ) 参数: class 类的名字。 pointer 将要被强制转换为class类对象指针的指针。 说明: DYNAMIC_DOWNCAST宏提供了将一个指针强制转换为指向一个类的对象的指针的简单方式,同时检查这种强制转换是否合法。这个宏将会把pointer参数强制转换为class参数类型的对象指针。 如果pointer参数所指向的对象就是class类的对象,这个宏将返回一个适当的指针。如果这种转换不合法,这个宏将返回NULL。