C++ - 在派生类上使用的 typeid() 不返回正确的类型

2023-11-26

也许我误解了继承在这里的工作原理,但这是我的问题:

我有一个 Option 类,以及一个从它派生的 RoomOption 类。我有另一个 Room 类,它包含一个shared_ptrs 向量。在 main 中,我向该向量添加了 RoomOption。然后,使用 typeid() 检查类型,它告诉我它是一个选项。从我读到的内容来看, typeid 应该返回派生类型,并且 shared_ptrs 不会导致切片,所以我不确定我做错了什么。

这是代码:

Room.h:

vector<shared_ptr<Option> > options;
void addOption(shared_ptr<Option>);
shared_ptr<Option> getOption(int);

房间.cpp:

void Room::addOption(shared_ptr<Option> option){
    options.push_back(option);
}

shared_ptr<Option> Room::getOption(int i){
    return options[i];
}

main:

shared_ptr<Room> outside(new Room(0, "", ""));
outside->addOption(shared_ptr<RoomOption>(new RoomOption(0, "Go inside", hallway)));
cout<<typeid(player->getRoom()->getOption(0)).name().get()<<endl; 
//This line prints "class std::tr1::shared_ptr<class Option>

我想到,也许在添加或获取选项时,由于返回/参数类型,RoomOption 被转换为选项。如果是这种情况,那么我应该如何存储不止一种类型的向量?还是我把这一切都搞错了? =\


The typeid对于多态类型(对于具有至少一个虚函数的类)和非多态类型,工作方式不同:

  • 如果类型是多态的,则对应的typeinfo表示它的结构是在运行时确定的(vtable 指针通常用于此目的,但这是一个实现细节)

  • 如果类型不是多态的,则在编译时确定相应的 typeinfo 结构

在你的例子中,你实际上有一个多态类Option, but shared_ptr<Option>itsef 根本不是多态的。它基本上是一个装有Option*。绝对有no之间的继承关系Option and shared_ptr<Option>.

如果要获取真实类型,首先需要使用以下命令从其容器中提取真实指针Option* shared_ptr<Option>::get() :

Option * myPtr = player->getRoom()->getOption(0).get();
cout << typeid(*myPtr).name(); << endl;

或者(这是完全相同的事情):

Option& myPtr = *player->getRoom()->getOption(0);
cout << typeid(myPtr).name(); << endl;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ - 在派生类上使用的 typeid() 不返回正确的类型 的相关文章

  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 私有模板函数

    我有一堂课 C h class C private template
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • 根据接口生成表达式

    我遇到了例外无法将类型 MySomeTypeThatImplementsISomeInterfaceAndIsPassedAs T ToTheClass 转换为类型 ISomeInterface LINQ to Entities 仅支持转换
  • 重新分区(1) 和合并(1) 之间的区别

    在我们的项目中 我们使用repartition 1 将数据写入表中 我有兴趣知道为什么coalesce 1 不能在这里使用 因为repartition与coalesce I know repartition跨分区均匀分布数据 但是当输出文件
  • 如果使用.remove(),表单将无法提交?

    我对 Firefox jQuery 或两者都感到困扰 操作系统为 Windows 7 Firefox 版本为 4 0 1 jQuery 版本为 1 5 1 6 基本上我有一个表格button其中的元素 通过 jQuery 附加了一个单击事件
  • pandas.read_html 不支持小数逗号

    我正在使用读取 xlm 文件pandas read html并且工作几乎完美 问题是该文件使用逗号作为小数分隔符而不是点 默认在read html 我可以轻松地将一个文件中的逗号替换为点 但我有近 200 个具有该配置的文件 和pandas
  • 使用开发者工具时 IE9 是否启用“某些功能”?

    我正在使用 Google Maps Javascript API V3 最近我的地图上的图标没有显示在 IE9 中 为了弄清真相 我打开了IE的开发者工具 当我刷新地图时 图标出现了 然而 当我关闭 IE 并重新启动时 图标不存在 再一次
  • 没有会话绑定到当前上下文

    我按照这个教程进行操作 http nhforge org blogs nhibernate archive 2011 03 03 effective nhibernate session management for web apps as
  • TokenCache.BeforeAccess 上的 HttpContext.Current 为 null

    我正在使用 OWIN 和 OpenIDConnect 针对 Azure AD 测试一个 Web 项目 我正在使用此示例中的大部分代码 https github com Azure Samples active directory dotne
  • 使用 yyyy-MM-dd hh:mm:ss 格式解析的日期出现意外差异

    我运行下面的java代码来获取时差 import java text SimpleDateFormat import java util Calendar import java util Date import java util Tim
  • 如何找到命名空间及其成员的所有用法?

    我正在尝试搜索一个大型解决方案以查找给定名称空间或其成员的任何用法 例如 System IO Resharper 的 查找用法 允许我查找以下内容的参考System IO 但仅在明确使用时 如果文件声明using System IO 然后使
  • 如何限制递归子目录搜索的深度

    我有一个功能 当前可以抓取所有文件夹和子文件夹来检查我正在构建的小工具的 ACL 但我正在绞尽脑汁试图弄清楚如何限制它可以达到的深度 例如 您有一个 4 层深度的文件夹 但我希望只能获取其中 3 层的 ACL 目前我已将其编码如下 priv
  • Cakephp 使用 htaccess 和 htpasswd 进行密码保护 - 如何?

    在 Cakephp 中使用 htaccess 开发期间如何使用密码保护我的网站 我必须更改哪个 htaccess 文件 我必须在 htaccess 中写什么 我应该把 htpasswd 放在哪里 我在谷歌上搜索过 但找不到任何有用的东西 我
  • 为什么 Array.prototype 返回一个空数组?

    这可能是一个愚蠢的问题 但是为什么当我控制台时我得到一个空数组Array prototype 我期待着推送和弹出方法 大多数原型的内置方法都不是可枚举的 因此如果您使用它们将不会显示for in 你不应该在数组上这样做 但这只是一个例子 由
  • 请解释一下区别

    我有一个关于二维数组的程序 基地址是8678 include
  • 如何通过 php 中的网络服务发送/获取文件

    这可能吗 发送文件的正确方法是什么 thanks 如果您希望网络服务上传 下载文件 我不知道 无论如何你可以使用curl http fr php net curl 从其他网络服务器上传 下载文件 要从用户处获取上传到 Web 服务的某些文件
  • JavaScript 音频的未来?

    我正在教孩子们如何向他们的 JavaScript 游戏和网页添加音频 我了解 HTML5 音频 API 现在刚刚了解各种浏览器的问题 令人惊讶的是 IE 根本不支持 WAV 等 不过 显然有一个新的网络音频标准我不知道 Chrome 完全支
  • 在 PHP 中显示两个日期之间的所有周数[重复]

    这个问题在这里已经有答案了 任何人都可以告诉如何在 PHP 中显示两个日期之间涵盖的所有周数 日期可能是不同的年份 如果我使用开始日期为 2011 09 16 结束日期为 2011 09 21 它将显示第 37 周和第 38 周 你可以使用
  • 从 Javascript 端调用 Qt 函数 (QWebView)

    我有一个 Qt 项目 可以将任何 HTML 页面加载到 Web 视图中 我有以下代码main cpp file include mainwindow h include
  • 如何在 iText 生成的 PDF 中添加图像到我的标题?

    我正在使用 iText 生成 PDF 我创建了一个自定义 PdfPageEventHelper 来向每个页面添加页眉 和页脚 我的问题是我不知道如何添加图像 因此它显示在 标题框 中 我只知道如何将图像添加到文档内容本身 如果有意义的话 这
  • 如何从 URL 下载文件并将其保存在 Rails 中?

    我有一个要保存在本地的图像的 URL 以便我可以使用 Paperclip 为我的应用程序生成缩略图 下载和保存图像的最佳方式是什么 我研究了 ruby 文件处理 但没有遇到任何问题 尝试这个 require open uri open im
  • C++ - 在派生类上使用的 typeid() 不返回正确的类型

    也许我误解了继承在这里的工作原理 但这是我的问题 我有一个 Option 类 以及一个从它派生的 RoomOption 类 我有另一个 Room 类 它包含一个shared ptrs 向量 在 main 中 我向该向量添加了 RoomOpt