问题标签 [cross-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 投票
3 回答
2372 浏览

c++ - 检查交叉演员是否可行?

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

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

获取指向我指向的B基础对象的指针。C

我提到这一点的原因是,在我编写上述代码时,编译器可能还没有看到 的定义,C即使它已经看到了Aand B。这意味着编译器可能没有检测到 and 之间的任何类型的连接AB但它仍然必须编译代码,因为这样的类可能C存在并且dynamic_cast在某些情况下成功。

问题是这意味着我可能会意外地交叉转换为错误类型的对象。假设我有如下所示的类:

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

那么这dynamic_cast在运行时总是会失败,因为没有办法连接AD. 如果我D因为我打算使用而意外使用B,编译器将不会给我任何迹象表明我有一个毫无意义的演员表。

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

0 投票
1 回答
471 浏览

c++ - 什么更快:从虚拟基地向下投射或交叉投射?

这有点假设,因为我不太担心性能 - 只是想知道哪个选项实际上是最快/最有效的,或者是否没有任何区别。

假设我有以下代码用于支持重载的访问者模板:

然后将其用于创建通用访问者:

使用访问者最终会导致dynamic_cast<>'s from Visitorto VTarget<T>,这是一个交叉转换。

可以实现的另一种方式是创建Visitor一个虚拟基础VTarget<T>-MyVisitor然后不再需要直接从访问者继承。dynamic_cast<>Visitor::visit 代码中的Visitor.

执行强制转换时,一种方法比另一种方法快吗?或者您是否只因拥有虚拟基地而受到规模损失?

0 投票
4 回答
890 浏览

c++ - C ++中的复杂dynamic_cast

我在 C++ 中有以下情况:

  • 抽象基类Abstract1Abstract2. 他们是无关的。
  • Foo派生自Abstract1和的类Abstract2

我在一个编译单元中,我没有关于类的信息Foo(没有声明,没有定义)。只有Abstract1Abstract2是已知的。(实际上,Foo 甚至被定义在一个 DLL 中)

dynamic_cast 是否允许从Abstract1*to 转换Abstract2*?这是一个标准吗?

0 投票
1 回答
77 浏览

c++ - 为什么不允许这种交叉投射?

考虑这个简单的例子:

我得到:

编译器应该有足够的信息来确定Base2可以在Derived 没有 RTTI ( dynamic_cast) 的情况下获得这些信息并让我这样做:

为什么不允许这样做?(有人可能会争辩说编译器不知道是否foo1Derived类型,但即使从转换为例如static_cast也不检查类型)Base1Derived

注意:这个问题与我的类似,但并不完全相同,因为这里我们是交叉转换基类,而不是派生类