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;
}