社区
C语言
帖子详情
使用C语言的强制类型转换将基类指针转换成子类指针如何判断是否合法?
freedomnight
2017-05-23 01:59:21
项目中有一些地方使用C风格的强制类型转换语法转换基类指针为子类指针。
我做了个试验,发现即使指针内容不是对应的子类的实例,转换出来的指针依旧是可以使用的(错误地使用)。
由于编译器的配置等原因,现在不能讲这种写法替换成C++的 dynamic_cast ,请问有什么办法加强转换的安全行吗?
...全文
310
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
实用经验 35 尽量
使用
C++转换操作符
有C++编程经验的人,都会有这样的一个常识:除非必要,尽量不要对变量进行强制转换。这是因为强制转换是存在风险的。然而实际上有些事情有点儿事与愿违。也就是说在某些情况下,转型是必须的。由于
强制类型转换
无所不能,会给C++程序带来很大的安全隐患。因此建议在C++代码中
使用
C++提供的除reinterpret_cast以外的3种转换方式。除非必要禁止
使用
强制类型转换
和reinterpret_cast。
【C++专题】static_cast, dynamic_cast, const_cast探讨
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换。 第1部分. 相关概念解释 上行转换(up-casting):把
子类
的
指针
或引用
转换成
基类
表示。 下行转换(down-casting):把
基类
指针
或引用
转换成
子类
表示。 类型转换不安全性来源于两个方面: 其一是类型的窄化转化,会导致数据位数的丢失;比如int类型转short。float类型转int。 ...
C语言
70,026
社区成员
243,244
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章