static_cast和dynamic_cast的联系和区别

staic_cast静态强制;  

 不能在无关的指针之间进行static类型强制 

 class   CAnimal   
  {   
  //...   
  public:   
  CAnimal(){}   
  };   
    
  class   CGiraffe:public   CAnimal   
  {   
  //...   
  public:   
  CGiraffe(){}   
  };   
    
  int   main(void)   
  {   
  CAnimal   an;   
  CGiraffe   jean;   
    
  an   =   static_cast<CAnimal>(jean);//将对象jean强制成CAnimal类型   
  return   0;   
  }   

dynamic_cast的主要目的是: 

  1)它返回派生类对象的地址;   
  2)它测试基类指针是否指向下一尖括号<>中所指定类型的对象   
 dynamic_cast是一个运行时类型信息,dynamic_cast运算符将指向派生对象的基类部分的基类指针转变为指向派生对象的派生类指针,dynamic_cast必须严格地指定与派生对象相同的类,或者它返回NULL指针; 

class   CAnimal   
  {  

  //...  

  };  

  class   CGiraffe:public   CAnimal   
  {   
  //...   
  };   
  class   CGoat:public   CAnimal   
  {   
  //...   
  };   

  int   main()   
  {   
  CGiraffe   gene;   
  CAnimal   *   aptr   =   &gene;   
  CGiraffe   *   ptr1,*   ptr2;   
    
  ptr1   =   dynamic_cast<CGiraffe   *>(aptr);   
  ptr2   =   dynamic_cast<CGoat   *>(aptr); //return   NULL   
    
  return   0;   
  }  


 

static_cast与dynamic_cast

关键词: dynamic_cast    static_cast                                           

动态强制把测试与强制转换结合到一起,即先进行类型检查(运行时类型检查),如果能转换就转换否则返回空指针。也就是说,在你不知道(或无法确定)指针所指对象具体类型时,可以使用dynamic_cast进行强制转换。static_cast用于基类到派生类的转换,且不作类型检查如:  

class CBase     
{};   
clase CDriver:public CBase   
{};   
      
void f(CBase   *   pB)   
{   
        //CDriver   *   pD   =   (CDriver   *)pB;       
        CDriver   *pD = static_cast<CDriver*>(pB);
}
 
void main()   
{     
 CBase   *   pBase   =   new   CDriver;   
 //call   f     
 f(pBase);   
}


1。dynamic_cast:运行时检查,用于多态的类型转换(upcast,downcast和crosscast),只能转换指针和引用。
2。static_cast:编译时检查,用于非多态的转换,可以转换指针及其他,比如:int->float还可以逆隐式转换,比如:比如:int->char。It is left to the programmer to ensure that the results of a static_cast conversion are safe.
3。对于指针的转换:The dynamic_cast and static_cast operators move a pointer throughout a class hierarchy. However, static_cast relies exclusively on the information provided in the cast statement and can therefore be unsafe.这与dynamic_cast使用rtti的检查是不同的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值