新闻资讯
看你所看,想你所想

dynamic_cast

dynamic_cast

dynamic_cast

将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理

基本介绍

  • 外文名:dynamic_cast
  • 特点:可以在执行期决定真正的类型
  • 用途:类层次间的上行转换和下行转换
  • 性质:运算符

用法

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更安全。
classB{public:int m_iNum;virtual void foo();};classD:publicB{public:char* m_szName[100];};void func(B* pb){D* pd1=static_cast<D*>(pb);D* pd2=dynamic_cast<D*>(pb);}
在上面的代码段中,如果 pb 指向一个 D 类型的对象,pd1 和 pd2 是一样的,并且对这两个指针执行 D 类型的任何操作都是安全的;但是,如果 pb 指向的是一个 B 类型的对象,那幺 pd1 将是一个指向该对象的指针,对它进行 D 类型的操作将是不安全的(如访问 m_szName),而 pd2 将是一个空指针。
另外要注意:B 要有虚函式,否则会编译出错;static_cast则没有这个限制。
这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函式表(关于虚函式表的概念,详细可见<Inside c++ object model>)中,只有定义了虚函式的类才有虚函式表,没有定义虚函式的类是没有虚函式表的。

交叉转换

另外,dynamic_cast还支持交叉转换(cross cast)。如下代码所示:
classA{public:intm_iNum;virtual void f(){}};class B:public A{};class D:public A{};void foo(){B*pb=new B;pb->m_iNum=100;//D*pd1=static_cast<D*>(pb);//compile errorD*pd2=dynamic_cast<D*>(pb);//pd2isNULLdelete pb;}

转载请注明出处安可林文章网 » dynamic_cast

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:fendou3451@163.com