为什么从类到子类的动态转换要求类是多态的?

2024-01-08

据我了解,动态转换与静态转换的不同之处在于它对 RTTI 的使用,并且如果变量的动态类型(从基类转换为派生类时)不适合,则动态转换会失败。但是,如果我们无论如何都有 RTTI,为什么类必须是多态的才能完成呢?

编辑:由于对“多态”一词的使用存在一些困惑,这里是 cplusplus.com 中的条目促使我提出这个问题:

Dynamic_cast 只能与对象的指针和引用一起使用。其目的是确保类型转换的结果是所请求类的有效完整对象。

因此,当我们将一个类强制转换为其基类之一时,dynamic_cast 总是成功的

classes: class CBase { };
class CDerived: public CBase { };

CBase b; CBase* pb; CDerived d;
CDerived* pd;

pb = dynamic_cast<CBase*>(&d);     //ok: derived-to-base 
pd = dynamic_cast<CDerived*>(&b);  //wrong: base-to-derived 

这段代码中的第二次转换将产生编译错误,因为除非基类是多态的,否则动态_cast 不允许进行基类到派生类的转换。

http://www.cplusplus.com/doc/tutorial/typecasting/ http://www.cplusplus.com/doc/tutorial/typecasting/


RTTI 信息仅适用于具有虚拟成员的班级。 (假设的实现是 vtable 包含dynamic_cast 工作所需的内容;您可以制定其他方案,但所有方案都需要对象中的类型标识符,所以为什么不使用 vptr?)

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

为什么从类到子类的动态转换要求类是多态的? 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问

随机推荐

  • 使用node.js从输入中获取密码

    如何使用node js从输入中获取密码 这意味着您不应该输出在控制台中输入的密码 您可以使用read https www npmjs com package read module 披露 我写的 为了这 在你的外壳中 npm install
  • python 中的块作用域 - 与函数内部的 javascript 提升类似吗?

    我目前正在尝试理解Python中的这段代码 def foo a if a 12 var Same else var different 我阅读并理解了 python 不支持基于块的作用域这一事实 因此 函数内创建的所有内容 无论是在循环内还
  • 如何使用 Akka HTTP 表示表单数据请求?

    我想创建一个表单数据http请求脸书API https developers facebook com docs graph api video uploads使用 Akka HTTP 在curl中 请求示例如下所示 curl X POST
  • 检查数据库连接,否则显示消息

    我想检查该网站是否可以连接到 mySQL 如果没有 我想显示一个错误 指出用户应该在几分钟内尝试再次访问该页面 我真的不知道该怎么做 任何帮助将不胜感激 string mysql error resource link identifier
  • 使用 firebug 查找 JavaScript 中的内存泄漏?

    是否有适用于 Firefox 的附加组件可以用来找出部分 JavaScript 导致内存泄漏的情况 我对 Firefox 没有任何了解 但 Chrome 中的 webkit 检查器有一个内置的分析器 非常适合此类事情 作为一个额外的好处 它
  • 在Python中加载大文件

    我正在使用在 Ubuntu 9 04 上运行的 Python 2 6 2 GCC 4 3 3 我需要使用 Python 脚本逐行读取一个大数据文件 1GB gt 300 万行 我尝试了以下方法 发现它占用了很大的内存空间 3GB for l
  • 正则表达式,匹配不带“http://”和任何其他“/”的 url

    我环顾四周 但可能我无法使用正确的关键字 谷歌 所以我在这里 我需要将 url 剥离协议与第一个 相匹配 Target 匹配从 http 到第一个 可能是最后一个 不存在 或到结尾的第一个子字符串 那么问题来了 我写了这个正则表达式 但这个
  • 预定义类型“System.Runtime.CompilerServices.IsExternalInit”未定义或导入[重复]

    这个问题在这里已经有答案了 我在使用 Visual Studio 2019 Preview 测试 C 9 0 的新功能时一直遇到这个问题 我正在测试 init setter 但编译器显示错误并显示以下消息 错误 CS0518 未定义或导入预
  • 通过 Exchange EWS API 批准电子邮件

    我遇到一种情况 我需要将邮件重新路由到另一个作为主持人的邮箱 以编程方式 有没有办法批准我在主持人邮箱中收到的消息 我没有看到 EWS 对此有明确的支持 微软还有其他 API 类型支持这个吗 这不是官方批准的方式 但以下解决方法可以帮助我批
  • jQuery 增量读取 AJAX 流?

    我读过了这个问题 https stackoverflow com questions 6093103 jquery ajax display data as it comes in但它并不能完全回答我的问题 不幸的是 自从我上次查看 AJA
  • 找不到类型或命名空间 AppServiceConnection

    我无法找到在新计算机上编译的解决方案 该解决方案包含一个与控制台应用程序打包在一起的 UWP 应用程序 UWP 应用程序通过以下方式与控制台应用程序进行通信应用服务连接 https learn microsoft com en us uwp
  • 覆盖moment js默认的无效日期文本

    我如何覆盖 moment js var defaultInvalidDate Invalid date 无需更改 moment js 文件 就像我的网站使用 Site css 覆盖某些 bootstrap css 样式一样 所以当 boot
  • 使用 SFINAE 检测 C++ 中类型的 POD 性

    这里原来的标题是VS2005 C 中 SFINAE 错误的解决方法 这是暂时使用 SFINAE 来等效 TR1 中存在的 is pod 模板类 在 VS2005 中还没有 TR1 应该有它的value当模板参数是 POD 类型 包括基本类型
  • Ansible SSH 转发似乎不适用于 Vagrant

    好吧 奇怪的问题 我有 SSH 转发与 Vagrant 一起使用 但我试图在使用 Ansible 作为 Vagrant 配置程序时让它工作 我准确地找到了 Ansible 正在执行的内容 并亲自从命令行尝试了它 果然 它也失败了 commo
  • 需要有关 Twitter 小部件的帮助

    我创建了一个 jquery 插件 它在左侧放置一个侧边栏以显示社交媒体内容 我有下面的变量 它是内容的来源 我正在尝试使用该小部件拉入 twitter feed 但我不断收到错误 TWTR 未定义 任何想法如何解决这一问题 该页面正在调用我
  • 使用 Swift 转义 unicode 字符,即 \u1234

    在 xcode 6 中使用 JSON 和 swift 时 我遇到特殊字符问题 我在 Cocoa objective C 中找到了这些代码来解决一些转换重音的问题 但无法使其在 Swift 中工作 关于如何使用它有什么建议吗 最好的替代建议也
  • Logstash 索引文本文件

    我想在 Elasticsearch 中导入一个文本文件 该文本文件每行包含 3 个值 经过几个小时的努力 我还是没有完成 非常感谢您的帮助 安装了 Logstash 的 Elasticsearch 5 4 0 样本数据 username e
  • 如何仅在第一次调用模拟方法时抛出异常?

    我有一个可以多次调用的模拟对象的方法 想想递归 该方法定义如下 public void doCommit 为了让它失败 我使用这个约定 doThrow new RuntimeException when mMockedObject doCo
  • 如何强制单表继承的引用完整性?

    我读过一些比尔 卡尔文的 https stackoverflow com users 20860 bill karwin回答关于单表继承 https stackoverflow com questions 441001 possible t
  • 为什么从类到子类的动态转换要求类是多态的?

    据我了解 动态转换与静态转换的不同之处在于它对 RTTI 的使用 并且如果变量的动态类型 从基类转换为派生类时 不适合 则动态转换会失败 但是 如果我们无论如何都有 RTTI 为什么类必须是多态的才能完成呢 编辑 由于对 多态 一词的使用存