社区
C++ 语言
帖子详情
dynamic_cast
vicness
2008-09-25 06:54:46
RTTI中的dynamic_cast不是只能由子类转换为基类可以用吗?
为什么我看有的程序中从基类转换到子类也可以用啊?
...全文
76
9
打赏
收藏
dynamic_cast
RTTI中的dynamic_cast不是只能由子类转换为基类可以用吗? 为什么我看有的程序中从基类转换到子类也可以用啊?
复制链接
扫一扫
分享
转发到动态
举报
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,
static_
cas
t、
dynamic
_
cas
t、reinterpret_
cas
t和const_
cas
t
标准C++的类型转换符:static_
cas
t、
dynamic
_
cas
t、reinterpret_
cas
t和const_
cas
t
C++中转型
dynamic
_
cas
t.
C++中转型
dynamic
_
cas
t.C++中转型
dynamic
_
cas
t.C++中转型
dynamic
_
cas
t.
static_
cas
t、
dynamic
_
cas
t、const_
cas
t 和 reinterpret_
cas
t。的区别与联系
通常来说,static_
cas
t 是最常用的,而
dynamic
_
cas
t 主要用于处理类层次结构中的多态情况,const_
cas
t 用于处理 const 修饰符的变换,reinterpret_
cas
t 的使用较为特殊,需要谨慎考虑。总体来说,static_
cas
t、
dynamic
_
cas
t、const_
cas
t 和 reinterpret_
cas
t 用于不同的场景,具有不同的安全性和适用性。• 用于底层的、不安全的类型转换,通常用于指针和整数之间的转换,或者进行底层的内存重解释。
C++中的
dynamic
_
cas
t和
dynamic
_pointer_
cas
t
dynamic
_
cas
t: 将一个基类对象指针(或引用)
cas
t到继承类指针,
dynamic
_
cas
t会根据基类指针是否真正指向继承类指针来做相应处理。 主要用途:将基类的指针或引用安全地转换成派生类的指针或引用,并用派生类的指针或引用调用非虚函数。如果是基类指针或引用调用的是虚函数无需转换就能在运行时调用派生类的虚函数。 转换方式:
dynamic
_
cas
t< type* >...
C++四种类型转换,static_
cas
t、
dynamic
_
cas
t、const_
cas
t、reinterpret_
cas
t
C++四种类型转换,static_
cas
t、
dynamic
_
cas
t、const_
cas
t、reinterpret_
cas
t1. 静态转换(static_
cas
t)2. 动态转换(
dynamic
_
cas
t)3. 常量转换(const_
cas
t)4. 重新解释转换(reinterpret_
cas
t) 类型转换(
cas
t)是将一种数据类型转换成另一种数据类型。例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型。 转换是非常有用的,但是它也会带来一些问题,比如在转换指针时,我们
C++ 语言
65,199
社区成员
250,520
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章