C++的四种强制类型转换

1.const_cast        

用于强制去除不能被修改的常量属性,即去掉类型的const和volatile属性。去除常量性的对象必须为指针或引用。

用法:const_cast<type_id>(expression)

const int a = 10;
int* p = const_cast<int*>(&a);

最终转换的类型放在<>中,可以转换,则运行成功,不能转换,则报语法错误。

2.static_cast     

用于无条件转换,静态类型转换。安全性更高。

double a = 10.0;
int* p = static_cast<int*>(&a);//报错

如果可以转换成功,说明没有安全隐患。

3.reinterpret_cast

仅重新解释类型,但没有进行二进制的转换。类似C转换,转换的类型必须是一个指针。最普通的用途就是在函数指针类型之间进行转换。

用法:reinterpret_cast<type_id>(expression)

4.dynamic_cast

用于RTTI信息转换,有条件转换,动态类型转换,运行时检查类型安全,转换失败返回NULL。

用法:dynamic_cast<type_id>(expression)

#include<iostream>
#include<string>

class Bird
{
public:
	Bird(std::string nm) : mname(nm){}
	virtual void fly() = 0;
protected:
	std::string mname;
};
class Eagle : public Bird
{
public:
	Eagle(std::string name) : Bird(name){}
	void fly()
	{
		std::cout << mname << " can fly 2000m!" << std::endl;
	}
};
class Chicken : public Bird
{
public:
	Chicken(std::string name) : Bird(name){}
	void fly()
	{
		std::cout << mname << " can fly 0m!" << std::endl;
	}
};
//方法一:
void ShowFly(Bird* pb)
{
	Chicken* pc = dynamic_cast<Chicken*>(pb);
	if (pc == NULL)
	{
		pb->fly();
	}
	else
	{
		std::cout << "Chicken can not fly!" << std::endl;
	}
}
//方法二:
//void ShowFly(Bird* pb)
//{
//	if (typeid(*pb) == typeid(Chicken))
//	{
//		std::cout << "this bird can not fly!" << std::endl;
//	}
//	else
//	{
//		pb->fly();
//	}
//}

int main()
{
	Eagle* pe = new Eagle("eagle");
	Chicken* pc = new Chicken("chicken");
	ShowFly(pe);
	ShowFly(pc);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值