C++(24)——语言级别提供的四种类型强转的方式

前言

不同于C语言的类型转换的不安全性,无检查机制,比如没有关系的类型间的转换。
C++提供了更多的类型转换方式。

语言级别提供的四种类型强转的方式

  1. const_cast :去掉(指针或引用)常量属性的类型转换
  2. static_cast:提供编译器认为安全的类型转换,基本类型之间的转换以及子类向父类的安全转换
  3. reinterpret_cast类似于C风格的强制类型转换
  4. dynamic_case:主要用在继承结构中,子类和父类之间的安全转换(向上转换安全、向下转换时类型检查)
使用示例
1、const_cast,使用时注意保持类型的一致,经常用在去常性的地方

注意<>内部必须是指针或者引用类型,不能放一个常量

const int a = 10;
int *p1 = (int *)&a;
int *p2 = const_cast<int*>(&a);
2、static_cast,使用频率最高,相当于一种编译时期的类型转换

编译器只转换认为有联系的类型,在没有任何联系的类型之间做转换是不被允许的,比如int*——>short*,
若将int*——>double*,那么在解引用后,变成8个字节,不安全,但这个需要开发者自己解决,而不是由static_cast来保证。

int a = 10;
char b = static_cast<int>(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"<<endl;}
};
class Derive2:public Base
{
public:
	void func(){cout<<"call Derive2::func"<<endl;}
};

void showFunc(Base *p)
{
	p->func();//动态绑定
}

int main()
{
	Derive1 d1;
	Derive2 d2;
	showFunc(&d1);
	showFunc(&d2);
}

假设当前代码需求更改,在调用2对象时,使用其新功能:

class Derive2:public Base
{
public:
	void func(){cout<<"call Derive2::func"<<endl;}
	//Derive2实现的新功能的API接口函数
	void Derive2func(){cout<<"call Derive2::Derive2func"<<endl;}
};

那么我们就需要识别基类指针的类型,如果是Derive2就使用新功能,
我们可能会想到类似于下面这样的方法:

typedef(*ip).name() == "Derive2"

但是实际上,我们不会用上述这种类似于比较字符串的方法进行类型转换:
dynamic_cast会检查p类型的指针是否指向一个Derive2类型的对象,如果是则转换成功,返回Derive2的类型地址,否则返回nullptr
转换的原理依然是:p->vfptr->vftable->RTTI信息

void showFunc(Base *p)
{
	Derive2 *pd2 = dynamic_cast<Derive2*>(p);
	if(pd2 != nullptr)
	{
		pd2->Derive2func();
	}
	else
	{
		p->func();//动态绑定
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值