关键字 dynamic_cast static_cast reinterp__cast 的用处和区别

Icyee 2005-03-22 02:34:13
如题
...全文
152 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jerry 2005-03-22
  • 打赏
  • 举报
回复
dynamic_cast 安全的转换, 无法完成的转换会返回0(指针)或者抛出异常(引用). 效率较低
static_cast 快速的类型转换, 如果一个类型可以转换到另一个类型则转换一定会成功. 显然有可能A类型并不是一个真正的B类型.

reinterp__cast 简单的转换. 仅仅将一个类型转换成另一个类型,不作任何调整


举例:

class A
{
...
};

class B : public A
{
...
};


class C
{
....
};

class F : public A
{
...
};

class D : public F, public B
{
...
};

A* pa = new B(); // pa 实际指向一个B对象
B* pb = dynamic_cast<B*>(pa); // 转换成 B对象指针, 这里会成功,因为 pa实际指向一个B对象
pb = static_cast<B*>(pa); // 成功,因为A和B之间有明确的继承关系
delete pa;


pa = new A(); // 现在pa 指向一个A对象
pb = dynamic_cast<B*>(pa); // 不成功,返回0, 因为pa不是指向一个B对象
pb = static_cast<B*>(pa); // 成功, 同上,但是这个pb指针在这里使用可能会出问题(并不是一定会出)


C* pc = static_cast<C*>(pa); // 这里编译就会出错.因为C*和A*之间没什么连系, 编译器不知道怎么转换
C* pc = reinterp_cast<C*>(pa); // 成功, 类型是转过来了,指针还是指向一个A对象(危险!!)

// 下面看看向上转型,这里有多继承.
D* pd = new D();
A* pa2 = dynamic_cast<A*>(pd); // 编译错误! 因为D包含A从两条不同的路径
A* pa3 = static_cast<A*>(pd); // 同上
A* pa4 = static_cast<A*>(static_cast<B*>(pd)); // 可以,通常这里会对指针值做调整.因为第二个基类的起点在派生类里可能会有变化
A* pa5 = reinterp_cast<A*>(pd); // 可以, 但这里不会调整指针值(危险!!)

// 反正 reinterp_cast 是万能的,你想让它转换到什么类型都是可以的(其实还是有限制,例如不能将A*转换到A,转换主要在于指针和引用之上)



goodluckyxl 2005-03-22
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3593/3593843.xml?temp=.7668421
经常有人问啊
dongpy 2005-03-22
  • 打赏
  • 举报
回复
dynamic_cast用于基类指针转换为派生类指针。
oyljerry 2005-03-22
  • 打赏
  • 举报
回复
dynamic_cast 一般用在父类和派生类指针之间转换
static_cast 不同类型的转换,类似C的类型转换
reinterp__cast 任何类型的转换,容易造成代码的难懂
Snow_1980 2005-03-22
  • 打赏
  • 举报
回复
more effective c++前面几节里就有
WingForce 2005-03-22
  • 打赏
  • 举报
回复
见C++ primer。。。。

64,664

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧