社区
C语言
帖子详情
使用C语言的强制类型转换将基类指针转换成子类指针如何判断是否合法?
freedomnight
2017-05-23 01:59:21
项目中有一些地方使用C风格的强制类型转换语法转换基类指针为子类指针。
我做了个试验,发现即使指针内容不是对应的子类的实例,转换出来的指针依旧是可以使用的(错误地使用)。
由于编译器的配置等原因,现在不能讲这种写法替换成C++的 dynamic_cast ,请问有什么办法加强转换的安全行吗?
...全文
302
9
打赏
收藏
使用C语言的强制类型转换将基类指针转换成子类指针如何判断是否合法?
项目中有一些地方使用C风格的强制类型转换语法转换基类指针为子类指针。 我做了个试验,发现即使指针内容不是对应的子类的实例,转换出来的指针依旧是可以使用的(错误地使用)。 由于编译器的配置等原因,现在不能讲这种写法替换成C++的 dynamic_cast ,请问有什么办法加强转换的安全行吗?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
freedomnight
2017-06-06
打赏
举报
回复
已经写代码验证,基类如果没有虚函数,确实不可使用dynamic_cast,而且delete这样的基类的指针也不会判断指针的实际对象类型而是忠实地调用基类的析构。
freedomnight
2017-06-06
打赏
举报
回复
如果有个基类Base和派生类Derived,然后有一个Base *arr[4] 里面放了4个Base类型对象指针,实际上都是指向Derived类型的实例的。 假设我的Base和Derived都没声明任何虚函数。 不考虑编译环境不支持dynamic_cast的问题,我使用这些指针时不可以使用dynamic_cast吗? 这时基类的析构相当于没有virtual的是吗?使用完了这个数组,我要delete[] arr,是不是会析构不完整呢?
sdghchj
2017-05-25
打赏
举报
回复
dynamic_cast 是基于虚函数表的,即使在c++中,没有虚函数的类或结构对象也是不能用dynamic_cast的
黑娃
2017-05-25
打赏
举报
回复
好奇怪的C,居然有继承关系
sdghchj
2017-05-25
打赏
举报
回复
C语言有基类子类的概念???
JXES智能生态系统
2017-05-24
打赏
举报
回复
不想用dynat_cast,自己小心使用指针就是了
freedomnight
2017-05-23
打赏
举报
回复
AIX的机器,gcc编译器,由于版本有一点旧,要支持dynamic_cast需要在编译选项中注明。 编译选项的配置是另一个产品组的,我们项目组不能修改。 C里面看来没有考虑过这种继承关系的问题,没办法解决就算了,只能写的时候时刻记住指针的类型了。
幻夢之葉
2017-05-23
打赏
举报
回复
引用 1 楼 jianwen0529 的回复:
指针这东西没办法,完全靠写作者本身的细心
能想到的就是实现运行时类型机制 类你都用了,为什么不能使用dynamic_cast?难道你的代码的编译器是古董级别?
幻夢之葉
2017-05-23
打赏
举报
回复
指针这东西没办法,完全靠写作者本身的细心
C++如何把
基类
指针
转换为
子类
指针
&
强制类型转换
在C++中,可以
使用
dynamic_cast运算符将
基类
指针
转换为
子类
指针
。dynamic_cast是一种安全的转换方式,它会在运行时检查转换是否
合法
。需要注意的是,。此外dynamic_cast只能用于类型的转换,。如果
转换成
功,dynamic_cast将返回指向派生类对象的
指针
;如果转换失败,dynamic_cast将返回空
指针
(nullptr)。因此,在进行dynamic_cast转换后,最好
使用
条件语句来检查转换的结果,以避免
使用
空
指针
进行操作。
C++面试
强制类型转换
符C++有四种
强制类型转换
符 dynamic_cast:将
基类
的
指针
或引用安全地转换为
子类
的
指针
或引用 const_cast:将常量
指针
或引用被转化成非常量的
指针
或引用,来修改常量 static_cast:
子类
指针
或引用向上
转换成
基类
(安全),
基类
指针
或引用向下
转换成
子类
(不安全),基本数据类型之间的转换,空
指针
转换成
目标类型的空
指针
,任何类型的表达式
转换成
void类型 reinterp
强制类型转换
强制类型转换
一、C风格的
强制类型转换
在
C语言
中,
强制类型转换
是通过“(目标类型)变量名”或者“目标类型(变量名)所实现的”,例如(int)3.14或者int(3.14),前者的方式常称之为C风格的类型转换,后者则被称之为函数风格的
强制类型转换
二、static_cast static_cast<目标类型>(expression) static即为静态类型转换,在编译时进行类型检查以及类型转换,但没有运行时类型检查来保障安全性,其作用主要有4个 1.相关类型间的转换,double->i
【C++专题】static_cast, dynamic_cast, const_cast探讨
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换。 第1部分. 相关概念解释 上行转换(up-casting):把
子类
的
指针
或引用
转换成
基类
表示。 下行转换(down-casting):把
基类
指针
或引用
转换成
子类
表示。 类型转换不安全性来源于两个方面: 其一是类型的窄化转化,会导致数据位数的丢失;比如int类型转short。float类型转int。 ...
类型转换(C++)
或者编译器会对常量进行优化,直接用它的值替换所有的引用,那么你修改的只是一个临时变量,而不是原来的常量。在main函数中,创建了一个B类的对象b,并将其地址分别赋给了指向A1和A2类型的
指针
ptr1和ptr2。reinterpret_cast可以将任何
指针
类型转换为任何其他
指针
类型,但是这种转换是不安全的,因为它不检查转换前后的
指针
是否兼容。这些输出的地址表明,指向A1类型的
指针
ptr1和指向A2类型的
指针
ptr2分别指向了B类对象b中不同的内存地址。每个包含虚函数的类或者虚继承的
子类
,都有一个虚函数表。
C语言
70,023
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章