
upcast:派生类转换为基类
downcast:基类转换为派生类
dynamic_cast
语法:dynamic_cast<待转换类型>(待转换数据)
- dynamic_cast在运行时处理
- dynamic_cast不能用于内置基本数据类型的强制转换,主要是用于类的指针或者类的引用的转换上
- 允许upcast,也允许downcast。在进行downcast时,dynamic_cast会进行类型检查。只有强制转换的指针指向的对象实际类型与将要转换后的类型相同时才能转换成功,还要求基类对象必须含有虚函数,因为进行类型检查需要运行时类型,这个信息含在虚函数表中。转换不成功,会返回空指针。
class Base{
public:
virtual void test(){
}
};
class Son:public Base{
};
int main(){
Base* pbb=new Base;
Base* pbs=new Son;
Son* pss=new Son;
Base* p;
Son* s;
p=dynamic_cast<Base*>(pss);//派生类转换成基类,允许
if(p==NULL)cout<<"error1"<<endl;
s=dynamic_cast<Son*>(pbs);//基类转换为派生类,基类原来指向派生类对象,允许,但是基类必须含有虚函数
if(s==NULL)cout<<"error2"<<endl;
s=dynamic_cast<Son*>(pbb);//基类转换为派生类,基类原来指向基类对象,不允许转换
if(s==NULL)cout<<"error3"<<endl;
return 0;
}
- 不允许两个没有关联的类的指针相互转换
class Pass{
};
class Base{
public:
virtual void test(){
}
};
.
.
.
Pass* pa=new Pass;
Base* p=dynamic_cast<Base*>(pa);//两个没有关联的类指针,不允许转换
static_cast
语法:static_cast<待转换类型>(待转换数据)
- static_cast在编译时处理
- 可以进行内置数据类型的转换,也可以进行类的指针或者类的引用的强制转换
int b=static_cast<int>(12.3);//内置数据类型的转换,允许
- 允许upcast,也允许downcast。static_cast的downcast不进行类型检查,因此是不安全的,程序员必须保证将被强制转换的类的指针指向的实际对象与将要转换的类型相同。
class Base{
public:
virtual void test(){
}
};
class Son:public Base{
};
int main(){
Base* pbb=new Base;
Base* pbs=new Son;
Son* pss=new Son;
Base* p;
Son* s;
p=static_cast<Base*>(pss);//派生类转换成基类,允许
s=static_cast<Son*>(pbs);//基类转换为派生类,基类指针原指向派生类对象,允许
s=static_cast<Son*>(pbs);
//基类转换为派生类,基类指针原指向基类对象,允许但是非常危险
return 0;
}
- 不允许两个没有关联的类的指针相互转换
class Pass{
};
class Base{
public:
virtual void test(){
}
};
.
.
.
Pass* pa=new Pass;
Base* p=static_cast<Base*>(pa);//两个没有关联的类指针,不允许转换
const_cast
语法:const_cast<待转换类型>(待转换数据)
- const_cast在编译时处理
- const_cast能够将常数据转换为非常数据
const char* str="12345";
char* temp=const_cast<char*>(str);//允许
reinpreter_cast
语法:reinpreter_cast<待转换类型>(待转换数据)
- reinpreter_cast在编译时运行
- 可以完成任意指针类型向任意指针类型的转换,不进行内容检查和类型检查,只是一个指针到别的指针的二进制拷贝
:四种cast的用法&spm=1001.2101.3001.5002&articleId=114135035&d=1&t=3&u=bacebde23b53461eb04bf5e81d7989bd)
2万+

被折叠的 条评论
为什么被折叠?



