dynamic_cast

vicness 2008-09-25 06:54:46
RTTI中的dynamic_cast不是只能由子类转换为基类可以用吗?
为什么我看有的程序中从基类转换到子类也可以用啊?
...全文
76 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
vicness 2008-09-25
  • 打赏
  • 举报
回复
加油!
vicness 2008-09-25
  • 打赏
  • 举报
回复
看来我理解的还是不够深入,需要继续努力!
谢谢各位兄弟!
richbirdandy 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 vicness 的回复:]
那这样的话,如何判断由父类到子类的转换是否成功呢?
[/Quote]
看RTTI啊 对象的虚表里有个type_info字段 根据typeid取得这个信息

相同的RTTI可以转换
不相同的话 有一下两种操作

对指针类型 返回空指针
对引用类型 抛出bad_cast异常
帅得不敢出门 2008-09-25
  • 打赏
  • 举报
回复
dynamic_cast

用法:dynamic_cast < type-id > ( expression )

该 运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个 引用。

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

class B{

public:

int m_iNum;

virtual void foo();

};

class D:public B{

public:

char *m_szName[100];

};



void func(B *pb){

D *pd1 = static_cast<D *>(pb);

D *pd2 = dynamic_cast<D *>(pb);

}

在 上面的代码段中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的;但是,如果pb指向的是一个 B类型的对象,那么pd1将是一个指向该对象的指针,对它进行D类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针。另外要注 意:B要有虚函数,否则会编译出错;static_cast则没有这个限制。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表 (关于虚函数表的概念,详细可见<Inside c++ object model>)中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。

另外,dynamic_cast还支持交叉转换(cross cast)。如下代码所示。

class A{

public:

int m_iNum;

virtual void f(){}

};



class B:public A{

};



class D:public A{

};



void foo(){

B *pb = new B;

pb->m_iNum = 100;

D *pd1 = static_cast<D *>(pb); //copile error

D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL

delete pb;

}

在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。
vicness 2008-09-25
  • 打赏
  • 举报
回复
那这样的话,如何判断由父类到子类的转换是否成功呢?
chen_yuan 2008-09-25
  • 打赏
  • 举报
回复
dynamic_cast 是用来将继承体系向下或横向的安全转换,
同时可以判断指针转换的时候是否成功!
vicness 2008-09-25
  • 打赏
  • 举报
回复
c++ Primer上不是说,从基类转到父类有危险吗,这样可能这样转过去,父类可能不具备子类的某些方法啊?
scklotz 2008-09-25
  • 打赏
  • 举报
回复
子类转基类直接赋值可以了。不需要dynamic_cast
从基类转换到子类才需要dynamic_cast
xuanyuanhaobo 2008-09-25
  • 打赏
  • 举报
回复
。。。子类转换到父类是默认的。。不需要任何特别的CAST。。

父类转换到子类才需要用 dynamic_cast,

65,199

社区成员

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

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