社区
C++ 语言
帖子详情
关键字 dynamic_cast static_cast reinterp__cast 的用处和区别
Icyee
2005-03-22 02:34:13
如题
...全文
152
6
打赏
收藏
关键字 dynamic_cast static_cast reinterp__cast 的用处和区别
如题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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。。。。
例说 const_
cas
t,re
int
erp
ret_
cas
t,
static
_
cas
t,
dynamic
_
cas
t代码.rar
例说 const_
cas
t,re
int
erp
ret_
cas
t,
static
_
cas
t,
dynamic
_
cas
t代码.rar
dynamic
_
cas
t,
static
_
cas
t 和 re
int
erp
ret_
cas
t
讨论
dynamic
_
cas
t,
static
_
cas
t<> 和 re
int
erp
ret_
cas
t<> and Runtime Type Information
标准C++的类型转换符:
static
_
cas
t、
dynamic
_
cas
t、re
int
erp
ret_
cas
t和const_
cas
t
标准C++的类型转换符:
static
_
cas
t、
dynamic
_
cas
t、re
int
erp
ret_
cas
t和const_
cas
t
static
_
cas
t、
dynamic
_
cas
t、re
int
erp
ret_
cas
t和const_
cas
t
标准C++的类型转换符:
static
_
cas
t、
dynamic
_
cas
t、re
int
erp
ret_
cas
t和const_
cas
t
c++
dynamic
_
cas
t与
static
_
cas
t使用方法示例
本文用示例讲解了
dynamic
_
cas
t、
static
_
cas
t子类与基类之间转换功能的使用方法
C++ 语言
64,664
社区成员
250,498
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章