C++:类型转换

C++四种类型转换

const_cast

去除常性 将常量指针转化为非常量指针

举例

const int a =10;
//int p=&a; 错误 不能从const int 转换为int*
int* p=const_cast<int*>(&a);

static_cast

最常用的类型转换 安全性高

reinterpret_cast

作指针类型的转换

dynamic_cast

RTTI信息 运行时转换

举例

class Bird
{
public:
	Bird(string name):mname(name)
	{
		
	}
	virtual void Fly()=0;
protected:
	string mname;
};

class Eagle:public Bird
{
public:
	Eagle(string name):Bird(name)
	{}

	void Fly()
	{
		cout<<mname<<" can fly 1000m"<<endl;
	}

};

class Chicken:public Bird
{
public:
	Chicken(string name):Bird(name){}
	void Fly()
	{
		cout<<mname<<" can fly 0m"<<endl;
	}

};

//template<typename BIRD>
//void Show(BIRD *pb)
//{
//	pb->Fly();
//}

//void Show(Bird *pb)
//{
//	if(typeid(*pb)==typeid(Chicken))
//	{
//		cout<<"Chicken can not fly"<<endl;
//	}
//	else
//	{
//		pb->Fly();
//	}
//}

//dynamic_cast

void Show(Bird *pb)
{
	Chicken *pc=dynamic_cast<Chicken*>(pb);
	if(pc!=NULL)
	{
		cout<<"Chicken can not fly"<<endl;
	}
	else
	{
		pb->Fly();
	}
}
int main()
{
	Eagle* pe=new Eagle("eagle");
	Chicken* pc=new Chicken("chicken");

	Show(pe);
	Show(pc);

	return 0;
}

此例中打印一个抽象类(含有纯虚函数的类)派生出的派生类中的方法采用了模板、比对派生类名称以及采用dynamic_cast的方法

Chicken pc=dynamic_cast<Chicken>(pb);

dynamic类型转换流程:首先通过pb这个Bird*基类指针找到对应的对象,在对象中找到虚函数指针,对虚函数指针解引用找到虚表并拿到RTTI信息,将RTTI信息与要转换的类型信息Chicken比对。如果相同则允许转换,即pc被允许指向chicken对象;如果不相同,则pc指向NULL。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值