使用C语言的强制类型转换将基类指针转换成子类指针如何判断是否合法?

freedomnight 2017-05-23 01:59:21
项目中有一些地方使用C风格的强制类型转换语法转换基类指针为子类指针。
我做了个试验,发现即使指针内容不是对应的子类的实例,转换出来的指针依旧是可以使用的(错误地使用)。
由于编译器的配置等原因,现在不能讲这种写法替换成C++的 dynamic_cast ,请问有什么办法加强转换的安全行吗?
...全文
244 9 打赏 收藏 转发到动态 举报
写回复
用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语言有基类子类的概念???
  • 打赏
  • 举报
回复
不想用dynat_cast,自己小心使用指针就是了
freedomnight 2017-05-23
  • 打赏
  • 举报
回复
AIX的机器,gcc编译器,由于版本有一点旧,要支持dynamic_cast需要在编译选项中注明。 编译选项的配置是另一个产品组的,我们项目组不能修改。 C里面看来没有考虑过这种继承关系的问题,没办法解决就算了,只能写的时候时刻记住指针的类型了。
幻夢之葉 2017-05-23
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
指针这东西没办法,完全靠写作者本身的细心
能想到的就是实现运行时类型机制 类你都用了,为什么不能使用dynamic_cast?难道你的代码的编译器是古董级别?
幻夢之葉 2017-05-23
  • 打赏
  • 举报
回复
指针这东西没办法,完全靠写作者本身的细心

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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