问题标签 [dynamic-cast]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
26643 浏览

c++ - 动态转换有哪些“好用”的例子?

我们经常听到/读到应该避免动态转换。根据您的说法,我想知道它的“有用”示例是什么?

编辑:

是的,我知道另一个线程:确实是在阅读那里的第一个答案时,我问了我的问题!

0 投票
5 回答
12984 浏览

c++ - c++ dynamic_cast 错误处理

是否有任何与 dynamic_cast 错误处理相关的良好做法(除非在您不需要时不使用它)?我想知道我应该如何处理它可以抛出的 NULL 和 bad_cast 。我应该检查两者吗?如果我捕捉到 bad_cast 或检测到 NULL,我可能无论如何都无法恢复……现在,我正在使用 assert 检查 dynamic_cast 是否返回非 NULL 值。你会在代码审查中接受这个解决方案吗?

0 投票
6 回答
15224 浏览

c++ - 什么可能导致 dynamic_cast 崩溃?

我有一段看起来像这样的代码:

有时它会崩溃:

我不知道它为什么会崩溃。obj不为空(如果是的话,它不会是一个问题,不是吗?)。

动态演员崩溃的原因可能是什么?

如果它不能转换,它应该只返回 NULL no 吗?

0 投票
9 回答
4250 浏览

c++ - 安全地检查变量的类型

对于一个系统,我需要将指针转换为 long 然后将 long 转换回指针类型。你可以猜到这是非常不安全的。我想做的是使用 dynamic_cast 进行转换,所以如果我混合它们,我会得到一个空指针。这个页面说http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=/com.ibm.vacpp7l.doc/language/ref/clrc05keyword_dynamic_cast.htm

dynamic_cast 运算符在运行时执行类型转换。dynamic_cast 运算符保证将指向基类的指针转换为指向派生类的指针,或将引用基类的左值转换为对派生类的引用。因此,程序可以安全地使用类层次结构。此运算符和 typeid 运算符在 C++ 中提供运行时类型信息 (RTTI) 支持。

如果它为空,我想得到一个错误,所以我编写了自己的动态演员表

使用 MSVC,我收到错误“错误 C2681:'long':dynamic_cast 的无效表达式类型”。事实证明,这只适用于具有虚函数的类...... WTF!我知道动态转换的重点是针对向上/向下转换继承问题,但我也认为它是为了动态解决类型转换问题。我知道我可以使用 reinterpret_cast 但这并不能保证相同类型的安全性。

我应该用什么来检查我的类型转换是否是同一类型?我可以比较这两个 typeid,但是当我想将派生的类型转换为它的基时会遇到问题。那么我该如何解决呢?

0 投票
2 回答
2658 浏览

c++ - C++:从“BaseNode*”到“Match*”的无效转换

0 投票
5 回答
10936 浏览

c++ - 带接口的动态转换

我有一个实现 2 个接口并继承 1 个类的类。所以,通常它看起来像这样:

代码中有一点我有一个IB *,但实际上可以使用一个A *. 我希望动态演员是这样的:

不幸的是,这不起作用。有没有合适的方法来做到这一点?还是我应该实施解决方法?我曾考虑过同时拥有IBIC从虚拟继承A,但上次我尝试 IIRC 时,有一些并发症使其不受欢迎。

有什么想法吗?

编辑:哦,是的,这是插件 API 的一部分,所以不幸的是我无法直接访问T我需要的类型A *。我的示例彼此相邻,但如前所述,它更复杂。基本上我有 2 个共享库。TT1(我有一个IB *)都是实现插件 API 的类,并且是共享库的内部。

澄清一下:这是我的典型插件的更具体示例(它们位于单独的库中):

插件A:

插件 B:

编辑:我猜问题是 pluginA 和 pluginB 在不同的共享库中。也许 rtti 不跨越模块边界。我认为可能是这种情况,因为人们的示例在我的测试中似乎运行良好。具体来说,如果我对它执行“nm”,pluginB 就没有“PluginA 的类型信息”。这可能是问题的核心。如果是这种情况,我只需通过虚拟继承或cast_to_qobject()我的一个接口中的虚拟函数来解决它。

0 投票
10 回答
7375 浏览

c++ - 如何在我的 C++ 代码中避免 dynamic_cast?

假设我有以下类结构:

让我们也给它Car一个句柄Engine。AFooCar将由 a 创建,FooEngine*aBarCar将由 a 创建BarEngine*。有没有办法安排事情,以便FooCar对象可以调用成员函数而FooEngine无需向下转换?

这就是为什么类结构按现在的方式布局的原因:

  1. 所有Cars 都有一个Engine. 此外, aFooCar只会使用 a FooEngine
  2. 所有Engines 共享的数据和算法我宁愿不复制和粘贴。
  3. 我可能想编写一个需要Engine知道它的函数Car

在编写这段代码时,我一打字dynamic_cast就知道我可能做错了什么。有一个更好的方法吗?

更新:

根据目前给出的答案,我倾向于两种可能性:

  1. 已经Car提供了一个纯虚getEngine()函数。这将允许FooCarBarCar拥有返回正确类型的Engine.
  2. Engine将所有功能吸收到Car继承树中。 Engine出于维护原因(将这些Engine东西保存在一个单独的地方)。这是拥有更多小类(小代码行)与拥有更少大类之间的权衡。

社区是否对其中一种解决方案有强烈的偏好?有没有我没有考虑过的第三种选择?

0 投票
7 回答
36370 浏览

c# - C#:动态转换类型

我目前有这种类型的代码:

假设 SomeClassType1 和 SomeClassType2 具有我想要分配的相同属性集(尽管它们在其他属性中可能不同),是否可以将 MainObject 动态转换为适当的类型,然后分配值,而无需复制代码?这就是我最终希望看到的:

显然 C# 抱怨找不到 DynamicType:

找不到类型或命名空间名称“DynamicType”(您是否缺少 using 指令或程序集引用?)

在 C# 2.0 中这样的事情可能吗?如果它比我当前的代码更混乱,那么我认为这样做没有任何意义,但我很想知道。谢谢!

编辑:澄清一下,我完全理解实现接口是最合适且可能正确的解决方案。也就是说,我更感兴趣的是如何在不实现接口的情况下做到这一点。感谢您的精彩回复!

0 投票
5 回答
566 浏览

c++ - 我应该如何区分子类

我有一个看起来像这样的令牌类:

所以基本上我必须在 Token 类中定义每个子类;结果并没有那么糟糕,因为子类很少,我无法想象它们会发生变化。但是,与使用动态转换识别子类相比,它仍然丑陋、笨拙且“正确”。然而:

也很笨拙。特别是当我必须将它们串在一个大的嵌套 if 中时。

那你会用哪个?这个问题还有其他解决方案吗?

注意:我知道无论如何我都必须强制他们获取各自的数据,但是

  1. 在我使用它们的功能之前,我不会施放它们,所以感觉更干净
  2. 我比使用他们的数据更频繁地测试他们的类型。

注意2:上面代码中没有说明的是这些token也是一个链表。这使得模板变得困难(aToken<int>可能指向 aToken<string>等)。这就是为什么我需要一个 Token 类作为父类开始的原因。

0 投票
6 回答
12306 浏览

c++ - dynamic_cast 失败

我有一个基类和一个派生类。每个类都有一个 .h 文件和一个 .cpp 文件。

我正在以下代码中将基类对象动态转换为派生类:

h 文件:

cpp 文件:

由于某种奇怪的原因,转换失败(返回 NULL)。但是,如果我将 Derived 类的构造函数的实现从 .h 移动到 .cpp 文件,则转换成功。

什么会导致它?

编译器是 gcc 3.1,在 Linux-SUSE 上。顺便说一句,我只在这个平台上看到这种行为,并且相同的代码在 Visual Studio 中运行良好。