C++ cast总结

本文介绍了C++中的static_cast、reinterpret_cast和dynamic_cast三种类型转换。static_cast用于低风险的隐式转换;reinterpret_cast执行明确的强制转换;dynamic_cast主要用于具有虚函数的基类与派生类间的指针或引用转换,它依赖于运行时类型信息,具有一定的运行时开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. static_cast:明确隐式转换

  低风险转换:int ⇒ float,char ⇒ int,void* ⇒ int *

2. reinterpret_cast:明确强制转换
3. dynamic_cast:用于具有虚函数的基类与派生类之间的 指针或引用转换
  • 基类必须具备虚函数:dynamic_cast是运行时类型检测,需要运行时类型信息(RTTI),该信息存储在虚函数表 ⇒ 被必要不使用,会有额外的函数开销;
  • 常用转换方式:1. 基类 ⇒ 派生类,必须使用 dynamci_cast
           2. 派生⇒ 基类:可以使用dynamic_cast,但推荐使用static_cast;
#include<bits/stdc++.h>
using namespace std;
class CFather{
  public:
    CFather();
    virtual void foo(){
      cout<<"CFather::void foo()"<<endl;
    }
    int vf;
};

class CSon : public CFather{
  public:
    virtual void foo(){
      cout<<"CSon::void foo()"<<endl;
    }
    int vson;
};

int main(){
  CFather f;
  CSon s; 

  CFather* pf = &f;
  CSon* ps = &s;
  
  // upcast: son->father, 都没问题,安全转换
  pf = static_cast<CFather*>(ps);
  pf = dynamic_cast<CFather*>(ps); // 不推荐,依赖RTTI,有额外开销,本来就是安全的

  // downcast: father->son
  ps = static_cast<CSon*>(pf); // 允许,但不安全;
  // ps->vson = 1;             // error
  ps = dynamic_cast<CSon*>(pf);// 在运行时刻检测是否安全
  if(ps!=nullptr){             // 不能转换将ps置为nullptr
    ps->vson = 1;
  }

  // 这种情况下是允许的,动态检测通过
  pf = ps;
  ps = dynamic_cast<CSon*>(pf);
  ps->vson = 1;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值