不同于C语言的类型转换的不安全性,无检查机制,比如没有关系的类型间的转换。
C++提供了更多的类型转换方式。
- const_cast :去掉(指针或引用)常量属性的类型转换static_cast:提供编译器认为安全的类型转换reinterpret_cast:类似于C风格的强制类型转换dynamic_case:主要用在继承结构中,可以支持RTTI类型识别的上下转换
注意:<>内部必须是指针或者引用类型,不能放一个常量
const int a = 10; int *p1 = (int *)&a; int *p2 = const_cast2、static_cast,使用频率最高,相当于一种编译时期的类型转换(&a);
编译器只转换认为有联系的类型,在没有任何联系的类型之间做转换是不被允许的,比如int*——>short*,
若将int*——>double*,那么在解引用后,变成8个字节,不安全,但这个需要开发者自己解决,而不是由static_cast来保证。
int a = 10; char b = static_cast(a);
问题:基类类型和派生类类型能不能用static_cast? 可以,其类型之间存在关联
3、reinterpret_cast,类似于C风格的强制类型转换 4、dynamic_case先上一个假想的使用场景:
class base
{
public:
virtual void func() = 0;
};
class Derive1:public base
{
public:
void func(){cout<<"call Derive1::func"<func();//动态绑定
}
int main()
{
Derive1 d1;
Derive2 d2;
showFunc(&d1);
showFunc(&d2);
}
假设当前代码需求更改,在调用2对象时,使用其新功能:
class Derive2:public base
{
public:
void func(){cout<<"call Derive2::func"<
那么我们就需要识别基类指针的类型,如果是Derive2就使用新功能,
我们可能会想到类似于下面这样的方法:
typedef(*ip).name() == "Derive2"
但是实际上,我们不会用上述这种类似于比较字符串的方法进行类型转换:
dynamic_cast会检查p类型的指针是否指向一个Derive2类型的对象,如果是则转换成功,返回Derive2的类型地址,否则返回nullptr
转换的原理依然是:p->vfptr->vftable->RTTI信息
void showFunc(base *p)
{
Derive2 *pd2 = dynamic_cast(p);
if(pd2 != nullptr)
{
pd2->Derive2func();
}
else
{
p->func();//动态绑定
}
}



