问题标签 [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.
c++ - 检查交叉演员是否可行?
我知道使用dynamic_cast
跨类层次结构进行“交叉转换”是合法的。例如,如果我有如下所示的类:
如果我有一个A*
指向 type 对象的指针C
,那么我可以使用
获取指向我指向的B
基础对象的指针。C
我提到这一点的原因是,在我编写上述代码时,编译器可能还没有看到 的定义,C
即使它已经看到了A
and B
。这意味着编译器可能没有检测到 and 之间的任何类型的连接A
,B
但它仍然必须编译代码,因为这样的类可能C
存在并且dynamic_cast
在某些情况下成功。
问题是这意味着我可能会意外地交叉转换为错误类型的对象。假设我有如下所示的类:
这里,D
是一些随机不相关的类。如果我尝试写这样的东西:
那么这dynamic_cast
在运行时总是会失败,因为没有办法连接A
和D
. 如果我D
因为我打算使用而意外使用B
,编译器将不会给我任何迹象表明我有一个毫无意义的演员表。
我的问题是:有什么方法可以让编译器警告我强制转换在运行时总是会失败? 对于可以检测到这一点的任何主要编译器,我都会对语言级解决方案或某些编译器设置感到满意。如果有外部工具,那也没关系;我只想知道是否有可能捕获此类错误。
c++ - 什么更快:从虚拟基地向下投射或交叉投射?
这有点假设,因为我不太担心性能 - 只是想知道哪个选项实际上是最快/最有效的,或者是否没有任何区别。
假设我有以下代码用于支持重载的访问者模板:
然后将其用于创建通用访问者:
使用访问者最终会导致dynamic_cast<>
's from Visitor
to VTarget<T>
,这是一个交叉转换。
可以实现的另一种方式是创建Visitor
一个虚拟基础VTarget<T>
-MyVisitor
然后不再需要直接从访问者继承。dynamic_cast<>
Visitor::visit 代码中的Visitor
.
执行强制转换时,一种方法比另一种方法快吗?或者您是否只因拥有虚拟基地而受到规模损失?
c++ - C ++中的复杂dynamic_cast
我在 C++ 中有以下情况:
- 抽象基类
Abstract1
和Abstract2
. 他们是无关的。 Foo
派生自Abstract1
和的类Abstract2
我在一个编译单元中,我没有关于类的信息Foo
(没有声明,没有定义)。只有Abstract1
和Abstract2
是已知的。(实际上,Foo 甚至被定义在一个 DLL 中)
dynamic_cast 是否允许从Abstract1*
to 转换Abstract2*
?这是一个标准吗?
c++ - 为什么不允许这种交叉投射?
考虑这个简单的例子:
我得到:
编译器应该有足够的信息来确定Base2
可以在Derived
没有 RTTI ( dynamic_cast
) 的情况下获得这些信息并让我这样做:
为什么不允许这样做?(有人可能会争辩说编译器不知道是否foo1
是Derived
类型,但即使从转换为例如static_cast
也不检查类型)Base1
Derived
注意:这个问题与我的类似,但并不完全相同,因为这里我们是交叉转换基类,而不是派生类