检查交叉投射是否可行?

2023-11-25

我知道使用是合法的dynamic_cast跨类层次结构进行“交叉转换”。例如,如果我有如下所示的类:

  A   B
   \ /
    C

如果我有一个A*指向类型对象的指针C,那么我可以使用

A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);

得到一个指向B的基础对象C我指着。

我之所以提到这一点是因为在我编写上面的代码时,编译器可能还没有看到C即使被看见A and B。这意味着编译器可能没有检测到之间的任何类型的连接A and B,但无论如何它仍然必须编译代码,因为对于像这样的类是可能的C存在并为了dynamic_cast在某种情况下取​​得成功。

问题是,这意味着我可能会意外地交叉转换到错误类型的对象。假设我有这样的类:

A   B    D
 \ /   
  C

Here, D是一些随机的不相关的类。如果我尝试写这样的东西:

A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);

那么这个dynamic_cast在运行时总是会失败,因为没有可能的连接方式A and D。如果我正在使用D意外地因为我打算使用B,编译器不会给我任何指示,表明我有一个毫无意义的强制转换。

我的问题是:有什么方法可以让编译器警告我强制转换在运行时总是会失败吗?我很乐意为任何可以检测到这一点的主要编译器提供语言级解决方案或一些编译器设置。如果有外部工具也没关系;我只是想知道是否有可能捕获此类错误。


在编译时不可能检测到这一点。班上C引入关系的内容可以在尚未编写的动态可加载库中找到,并且编译器无法证明其他情况。

但可能也有一些例外。如果A只有私有构造函数(或私有析构函数),那么编译器可以确定不会有未命名为友元的新子类A.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查交叉投射是否可行? 的相关文章

随机推荐

  • ActionScript 中的语法突出显示库

    我让用户在我的 Flex3 Flash 10 应用程序中输入一些代码 我想进行语法突出显示 有没有开源库可以帮助我 我需要 Lua 语法支持 但如果库有一个合理的接口来执行此操作 我可以自己添加它 2009 年 1 月 21 日更新 查看A
  • 如何本地化 Django 应用程序的内容

    嘿 我目前正在为我的学习开发一个 django 应用程序 并且已经到了 l18n 的地步 本地化网站本身非常容易 但现在我必须允许用户翻译应用程序的动态内容 用户可以将 产品 保存在数据库中并为其提供名称和描述 但由于整个站点应该本地化 因
  • R 在 Mac OS X Yosemite 中冻结

    我遇到了这个问题 并且没有关于如何解决这个错误的明确解释 每当我尝试保存使用 R 内部编辑器编写的文件时 OS X Mavericks 的最新版本 R v 3 1 2 就会在 Yosemite 中冻结 当您尝试时它也会冻结source一个函
  • 将 URL 解码为数组而不是字符串

    我目前正在使用 PayPals API 并希望将其响应之一从名称 值对转换为数组 到目前为止我已经用过urldecode 将响应解码为以下内容 email protected email protected MOREINFO lots mo
  • 如何跟踪和检查捆绑的 Ruby gem 中的依赖关系

    Bundler 将自动安装指定 gem 的任何依赖项 但它不会在标准输出中输出哪些依赖项映射到哪些 gem 当依赖项之一安装失败时 该信息非常有用 有没有办法将 Bundler 设置得更详细并在安装时告知依赖项 我正在使用 Bundler
  • DTE.执行命令并等待

    我想使用宏来发布我的网络应用程序项目 小问题是 DTE ExecuteCommand 异步运行 我需要等待命令完成 Example DTE Windows Item Constants vsWindowKindSolutionExplore
  • T-SQL Case 语句以 newid() 作为随机源的奇怪行为

    我正在使用 SQL Server 2012 如果我执行以下操作来获取 1 3 范围内的随机数字列表 则效果很好 SELECT TOP 100 ABS CHECKSUM NEWID 3 1 value of rand FROM sys obj
  • 有没有办法将音频文件发送到语音转文本识别

    我想要 Android 语音识别系统分析音频文件 而不是来自麦克风的默认传入语音 有什么办法可以做到这一点吗 谢谢 cmusphinx sourceforge net wiki tutorialandroid 刚刚发现该链接听起来像是有人创
  • 如何使用 py2exe 减小 exe 的大小

    我使用 python 和 wxwidgets 开发了一个小程序 这是一个非常简单的程序 仅使用一个迷你框架在需要时显示一些信息 其余时间则不显示任何内容 仅在任务栏中显示一个图标 当我使用 py2exe 单文件 exe 模式 优化 构建 e
  • SQL Server 2005 如何清除查询执行计划

    各位程序员大家好 我有一个 SQL Server 2005 查询 第一次处理需要很长时间 第一次运行后 查询的运行速度要快得多 从一分钟到一秒 我知道 SQL Server 正在缓存执行计划 这个术语正确吗 我想做的就是明确这个执行计划 以
  • 异常与断言

    Java异常处理和使用异常处理有什么区别assert状况 众所周知 Assert 有两种类型 但我们什么时候应该使用assert关键词 使用断言进行代码中的内部逻辑检查 并使用正常异常来处理直接代码控制之外的错误情况 不要忘记断言可以打开和
  • 如何正确解析由空格分隔的文本文件

    下面是我的示例文本文件 这是我的架构文件 Sample File txt ColNameHeader True Format TabDelimited CharacterSet ANSI 这是我迄今为止编写的用于尝试读取上述示例文件的代码
  • python 是否允许我在运行时将动态变量传递给装饰器?

    我正在尝试在工作中集成一个非常旧的系统和一个较新的系统 我能做的最好的事情就是利用系统使用的 RSS 消防站类型提要 目标是使用此 RSS 源让其他系统在某些人做某事时执行某些操作 我的想法是在某些函数周围封装一个装饰器来检查用户 RSS
  • 如何将 istream_view 收集到容器中?

    我试图为我的扩展实现一个通用的缩减操作c 20 s ranges这将收集任何元素range到给定的容器中 为了实现这一点 我首先创建了一个虚拟类型来提取template template参数并提供operator 用于梳理一个range用它
  • 如何处理 URL 中的转义字符(管道 |)(Spring、REST、CXF)?

    我正在使用 Spring CXF Tomcat 来开发 Web 服务 我在发送 URL 中的管道 等字符时遇到问题 例如 http localhost 9080 address v1 countries 抛出 500 错误 有没有办法处理它
  • Playstore 错误:App Bundle 包含本机代码,并且您尚未上传调试符号

    当我想向 Playstore 发布新的 flutter 应用程序包时 我收到此错误 此应用程序包包含本机代码 并且您尚未上传调试符号 我们建议您上传符号文件 以使崩溃和 ANR 更易于分析和调试 我找不到任何方法来解决这个问题 我是颤振和发
  • 为什么 ObservableCollection 不支持批量更改?

    造成的潜在问题有哪些ObservableCollection支持操作 例如AddRange or RemoveRange 既然 ObservableCollection 如此频繁地与 WPF 一起使用 那么 Microsoft 不提供它们肯
  • 为什么 Perl 不支持双引号中的哈希插值?

    usr bin perl use warnings my hash no1 gt 1 no2 gt 2 print hash Prints no11no22 print hash Prints hash 为什么 Perl 不支持双引号内的哈
  • Dc.js 将范围图应用于多个图表

    过去几周我一直在使用 dc js 但有一个问题我似乎无法解决 我希望能够使用画笔过滤器基于单个图表更改四个不同图表的比例 大致如下 priorityTotChart width 2 w 3 height h 3 margins top 10
  • 检查交叉投射是否可行?

    我知道使用是合法的dynamic cast跨类层次结构进行 交叉转换 例如 如果我有如下所示的类 A B C 如果我有一个A 指向类型对象的指针C 那么我可以使用 A aPtr something that produces a C B b