社区
C语言
帖子详情
使用C语言的强制类型转换将基类指针转换成子类指针如何判断是否合法?
freedomnight
2017-05-23 01:59:21
项目中有一些地方使用C风格的强制类型转换语法转换基类指针为子类指针。
我做了个试验,发现即使指针内容不是对应的子类的实例,转换出来的指针依旧是可以使用的(错误地使用)。
由于编译器的配置等原因,现在不能讲这种写法替换成C++的 dynamic_cast ,请问有什么办法加强转换的安全行吗?
...全文
361
9
打赏
收藏
使用C语言的强制类型转换将基类指针转换成子类指针如何判断是否合法?
项目中有一些地方使用C风格的强制类型转换语法转换基类指针为子类指针。 我做了个试验,发现即使指针内容不是对应的子类的实例,转换出来的指针依旧是可以使用的(错误地使用)。 由于编译器的配置等原因,现在不能讲这种写法替换成C++的 dynamic_cast ,请问有什么办法加强转换的安全行吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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语言
中的4种
强制类型转换
!
前言 在
C语言
中,我们需要做类型转换时,常常就是简单粗暴,在C++中也可以用C式
强制类型转换
,但是C++有它自己的一套类型转换方式。 C式的显示类型转换 先来说说C式的
强制类型转换
,它的用法非常简单,形如下面这样 Typeb=111; Typeaa=(Typea)b; 只需要用括号将你要转换的类型扩起来,放在要转换的变量前面即可。 举个例子: #include<st...
C和C++的
强制类型转换
C++ 四种
强制类型转换
一般来说,我们需要类型转换的场景可以分为如下几种: 整型和浮点型以及不同长度的数据相互转换 一般规则是:占用内存低的向占用内存高的自动转换,而反向则会有转换截断的问题 整型和
指针
相互转换 当我们试图根据某个成员变量的偏移位计算其在该对象内存空间位置时,就会需要将
指针
转换为整型进行计算。当计算出该变量的位置后(整型),就需要将其转换为
指针
类型。 整型和枚举类型相互转换。 这种转换往往发生在数学计算的场景下。因为枚举一般只是用于表意,而实际参与运算的还是整型数据。
指针
【C++】四种
强制类型转换
C++ 四种
强制类型转换
C语言
中的
强制类型转换
(Type Cast)有显式和隐式两种,显式一般就是直接用小括号强制转换,TYPE b = (TYPE)a; 隐式就是直接 float b = 0.5; int a = b; 这样隐式截断(by the way 这样隐式的截断是向 0 取整的,我喜欢这么叫因为 0.9 会变成 0,1.9 变成 1,-0.9 变成 0,-1.9 变成 -1)。 ...
从c++父类与
子类
指针
相互转换看c++
强制类型转换
c++与c的类型转换c与c++类型转换的比较c++
强制类型转换
c与c++类型转换的比较 c风格的类型转换一般是直接
使用
基本内置类型进行转换,c++中定义了4个关键字:static_cast、dynamic_cast、reinpreter_cast、const_cast,用于
强制类型转换
(cast). 下面举个c style类型转换,c++的几个
强制类型转换
关键字后面分别介绍。 int i =...
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章