dynamic_cast到底有什么用啊?

xinyi 2003-11-03 12:03:41
class B{};
class C : public B {};
class D : public C {};

void main()
{
D* pd = new D;

C* pc = dynamic_cast<C*>(pd);
B* pb = dynamic_cast<B*>(pd);
//C* pc = pd;
//B* pb = pd;

void *p=dynamic_cast<C*>(pd);
//void *p=pd;
}

换成被屏蔽掉的代码也能通过编译,那么dynamic_cast到底有什么用啊,有没有人举一个例子,加了dynamic_cast编译能通过,不加就不通过的。
...全文
420 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
电视人 2003-11-07
  • 打赏
  • 举报
回复
dynamic_cast的用途::::::::::::::::::::::

CObject是很多类的基类有个函数 fo(CObject* obj) 要根据运行时的情况来选择obj是哪个类,如果强制转换,则可能访问出错

最典型的是拿来做单根继承的框架,比如mfc

还有.net框架也是类似,不过动态转换的能力强的多,甚至int, char都可以继承自object,所以参数可以传入任意数据,然后在运行时判断参数类型
xkak2 2003-11-06
  • 打赏
  • 举报
回复
1、dynamic_cast不是强制转换,如果转换不成功,会返回0,或者抛出异常。
2、dynamic_cast会显著降低程序的效率,在各种c++的编译器上都是如此,一般来说,使用到dynamic_cast的部分效率降低15%以上是很正常的。所以如果你的程序能够不用dynamic_cast,那就不要用。
ameba 2003-11-05
  • 打赏
  • 举报
回复
quote:
>> 要运行RTTI的话就要在VC里面进行设置的。在工具-〉设置-〉C++ -〉分类选C++ Language
>> -> 选中允许RTTI

不是在"工具"下,而是在"项目(PROJECT)"下
daizh 2003-11-05
  • 打赏
  • 举报
回复
dynamic_cast用于在继承体系中进行安全的向下转型(downcast),也就是从基类指针/引用向派生类指针/引用的转型。
fierygnu 2003-11-05
  • 打赏
  • 举报
回复
dynamic_cast不是强制转换,而是咨询性质的。如果不能转换,dynamic_cast会返回NULL,表示不成功。这是强制转换做不到的。
fingerfox 2003-11-05
  • 打赏
  • 举报
回复
一楼的很正确啊。
fingerfox 2003-11-05
  • 打赏
  • 举报
回复
用于继承体系的强制转换
fierygnu 2003-11-03
  • 打赏
  • 举报
回复
dynamic_cast是运行时检查的,可以进行upcast和downcast。当然主要作用是downcast,即基类指针/引用到派生类指针/引用的转换。如果源和目标类型没有继承/被继承关系,编译器会报错;否则必须在代码里判断返回值是否为NULL来确认转换是否成功。
bosedom 2003-11-03
  • 打赏
  • 举报
回复
要运行RTTI的话就要在VC里面进行设置的。在工具-〉设置-〉C++ -〉分类选C++ Language
-> 选中允许RTTI
shenbinwangyy 2003-11-03
  • 打赏
  • 举报
回复
强制的类型转换
Wolf0403 2003-11-03
  • 打赏
  • 举报
回复
dynamic_cast<> 不是扩展 C style 转换的功能,而是提供了类型安全性。你无法用 dynamic_cast 进行一些无理的转换。
另外,dynamic_cast 是 RTTI 操作符,提供运行时类型检查

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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