迭代向量时 typeid.name() 不会改变。动态转换和 typeid 基类指针

2023-12-01

答:总之用虚函数!因此,实际上不要将其用作良好的设计,但出于学习目的,请阅读!

首先我想说我正在使用 c++ 和 Qt 我有一个形状指针向量(基类)

编辑: doSomething() 不是基类的成员,而是派生类的成员。这就是为什么我使用dynamic_cast 将 Shape* 获取到 Derived* 以便我可以访问它。我这样做实际上只是出于好奇,也为了其他人了解 c++ 的类型系统

    #include <vector>
    using namespace std;
    vector<Shape *> vec;

我推回一些形状的派生类

    vec.push_back(new Square());
    vec.push_back(new Circle());

好的,然后我得到一个迭代器到开头

    vector<Shape *>::iterator tmp = vec.begin();

这里我想迭代向量

    for(;tmp != vec.end(); ++tmp)
    {
        if(typeid(**tmp).name() == typeid(Square).name())
        {
            Square * sptr = dynamic_cast<Square *>(*tmp);
            sptr->doSomething();
        }
        else if(typeid(**tmp).name() == typeid(Circle).name())
        {
            Circle * cptr = dynamic_cast<Circle *>(*tmp);
            cptr->doSomething();
        }
    }

然而,两者都会产生 Square 输出;不是第二个圆圈。我尝试比较 typeid 的内存位置

Like so:

    &typeid(**tmp) == &typeid(Square)

对于圆也是如此,但 tmp 总是会在上面的情况下产生正方形,并且当之后立即与圆运行时...动态转换是否对整个矢量进行了一些操作,我只是错过了 typeid() 工作原理的一些东西?

编辑: 这是答案,感谢 user4581301 (我也添加了一些东西!):

#include <iostream>
#include <vector>
#include <typeinfo>

struct Shape
{
    virtual ~Shape(){} //Something here must be virtual or pure virtual!
};

struct Circle: Shape
{
    void doSomething(){std::cout << "Circle" << std::endl;}
};
struct Square: Shape
{
    void doSomething(){std::cout << "Square" << std::endl;}
};

int main()
{
    std::vector<Shape *> vec;
    vec.push_back(new Square());
    vec.push_back(new Circle());
    std::vector<Shape *>::iterator tmp = vec.begin();

        for(;tmp != vec.end(); ++tmp)
        {
            if(&typeid(**tmp) == &typeid(Square))
            {
                Square * sptr = dynamic_cast<Square *>(*tmp);
                sptr->doSomething();
            }
            else if(&typeid(**tmp) == &typeid(Circle))
            {
                Circle * cptr = dynamic_cast<Circle *>(*tmp);
                cptr->doSomething();
            }
        }


}

这按预期工作doSomething as a virtual功能。如果不是virtual,那么编译本身就会失败(如果里面没有其他函数的话)Shape类是virtual)。如果源类型不是多态的,动态转换将会失败。

如果是virtual,您无需执行正在执行的操作来确定类型。让多态发挥其魔力。您可以像这样缩短代码:

#include <iostream>
#include <vector>

class Shape { public: virtual void doSomething() {std::cout << "In Shape\n";}};
class Circle: public Shape {public: void doSomething() {std::cout << "In Circle\n";}};
class Square: public Shape {public: void doSomething() {std::cout << "In Square\n";}};

int main() {
    std::vector<Shape *> vec;
    vec.push_back(new Square);
    vec.push_back(new Circle);

    for(auto tmp = vec.begin();tmp != vec.end(); ++tmp)
    {       
        (*tmp)->doSomething();        
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代向量时 typeid.name() 不会改变。动态转换和 typeid 基类指针 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • Prism v4 使用 DirectoryModuleCatalog 按需加载模块

    在我的引导程序中 我有以下代码来创建我的 Directory ModuleCatalog protected override IModuleCatalog CreateModuleCatalog DirectoryModuleCatalo
  • “未定义的符号_memset”

    我问了类似的问题 但我有一些更新 这确实让我感到困惑 本质上 我想使用链接器链接多个目标文件 如下所示 usr ccs bin ld o q e start master dn z defs M mapfile q list of obje
  • 如何转换 NSString 中的日期时间格式?

    我从 xml 中获得了价值2009 11 23T05 24 41 000Z 现在我想显示这样的字符串 Wed Nov 4 2009 8 00 PM Wed Nov 4 2009 9 00 PM 怎么可能呢 Use NSDateFormatt
  • 嵌套对象空值检查

    我知道如何检查嵌套对象的多种方法NullPointerException 对于 Java 8 最简单的是应用Optional
  • Android 中旋转控件的图形问题

    我的第一个 旧 Android 应用程序 悬架计算器 显示了一个我找不到解决方案的问题 旋转器控件打开some旋转器在不需要的地方显示透明线 模式是这样的 从第一个微调器控件开始 所有其他微调器都遇到此问题 因此 虽然旋转器 2 4 6 没
  • 为什么Chrome要从style属性中读取svg圆半径?

    我使用 Chrome 开发工具进行开发 我刚刚用 IE11 进行了演示 嗯 是的 我的错误是没有使用 IE 检查 并且下面的语法不是有意的 在 d3 js 中设置属性时犯了错误 但我很受伤 因为我的图表没有显示 我想了解为什么我不能更早地发
  • 如何使用 Selenium Python 在 WordPress 帖子中上传文件?

    我试图使用自动化 WordPress 帖子内容创建Selenium Webdriver Python 不幸的是 我无法上传帖子内容中的文件 我已经搜索过解决方案 但大多数都使用send keys这不适用于 WP 插入介质 见下图 在插入媒体
  • 除了 MySQL 中的所有等效项

    所以我有一个名为members的表和另一个名为group的表 组的领导者也是成员 为了检索不是领导者的成员 我做了以下操作 代码 SELECT first name last name rank FROM members EXCEPT AL
  • 谷歌地图触摸底部工作表对话框

    我的底部工作表对话框的顶部有一个谷歌地图片段 我禁用了底部工作表行为上的可拖动触摸操作 以便我可以控制地图 问题是我无法使用向上或向下触摸操作滚动地图 因为我的底部工作表可拖动已禁用 我正在考虑当用户触摸地图时禁用底部工作表行为的触摸操作
  • 想要使用 PubNub 向用户的网络浏览器发送实时更新

    考虑使用 PubNub 向用户的 Web 浏览器发送实时更新 我查看了他们的网站和材料 看起来他们有几个不同的选择 我们希望使用它向用户正在查看的网页发送实时更新 该信息很简单 例如 您刚刚收到一条消息 我们并不是在尝试实现聊天程序或类似的
  • 使用 Jackson 或其替代方案将 JSON 树解析为普通类

    如何解析该 JSON foo bar baz Hello qux World 进入该类使用Jackson或其替代方案 public class Foo private String baz private String qux public
  • 使用旋转矩形的 4 个点在 PIL 中裁剪图像

    我有一个旋转矩形的四个点的列表 其形式为 points x1 y1 x2 y2 x3 y3 x4 y4 我可以使用以下方法在 PIL 中进行裁剪 img crop x1 y1 x2 y2 但这不适用于旋转的矩形 只是为了澄清 我希望旋转生成
  • XMLHttpRequest 模块未定义/未找到

    这是我的代码 var XMLHttpRequest require xmlhttprequest XMLHttpRequest var xhr new XMLHttpRequest xhr open GET URL xhr setReque
  • Python 删除字符串

    我有这 3 个字符串 黄色 小号 弹力 成人 T21fdsfdsfs黄色 小号 弹力 成人 Tdsfs黄色 小号 弹力 成人 TD 我想删除最后一个之后的所有内容 包括逗号 所以我想删除这些部分 T21fdsfdsfs Tdsfs and
  • 为什么静态和寄存器存储类不能一起使用?

    当按以下方式定义变量时 static register int a1 0 我们得到错误 error multiple storage classes in declaration specifiers 这个错误有什么根本原因吗 为什么变量不
  • PHP服务器端帖子

    我正在尝试让服务器端 POST 在 PHP 中工作 我正在尝试将交易数据发送到支付网关 但我不断收到以下错误 信息 fopen https secure ogone com ncol test orderstandard asp 无法打开流
  • JavaScript:可选回调? [复制]

    这个问题在这里已经有答案了 我编写了一个函数 它有 3 个参数 其中一个是回调函数 如何使回调成为可选参数 而不必编写另一个没有回调参数的函数 function myFunction arg1 arg2 callback do someth
  • 从数组中返回奇数或偶数

    只是需要帮助来确定我在这个代码战争挑战中做错了什么 我意识到这对某些人来说可能很容易 但请注意我只是 Javascript 的初学者 挑战 给你一个数组 长度至少为 3 但是 可能非常大 包含整数 该数组要么完全是 由奇数整数组成或完全由偶
  • 继承鉴别器的 .NET Linq to SQL 性能问题

    我遇到了具有大量继承类的 LINQ to SQL 模型的性能问题 我隔离了这个问题 它似乎是 LINQ to SQL 生成的代码本身的某种问题 我使用 Northwind 创建了一个示例程序来充实这个问题 在这两种情况下 它都会返回 Cus
  • 迭代向量时 typeid.name() 不会改变。动态转换和 typeid 基类指针

    答 总之用虚函数 因此 实际上不要将其用作良好的设计 但出于学习目的 请阅读 首先我想说我正在使用 c 和 Qt 我有一个形状指针向量 基类 编辑 doSomething 不是基类的成员 而是派生类的成员 这就是为什么我使用dynamic