dynamic_cast和static_cast

来源:互联网 发布:360急速浏览器 优化版 编辑:程序博客网 时间:2024/05/22 12:17

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还支持交叉转换(不同子类之间的转换),结构是空指针。

0 0