标签: cross-cast

c ++中的复杂dynamic_cast

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

  • 抽象基类Abstract1Abstract2.他们是无关的.
  • 一类Foo来自推导Abstract1Abstract2

我在一个编译单元,我没有关于类的信息Foo(没有声明,没有定义).只有Abstract1而且Abstract2众所周知.(实际上,Foo甚至在DLL中定义)

将dynamic_cast的允许从铸造Abstract1*Abstract2*?这是标准吗?

c++ polymorphism dynamic-cast language-lawyer cross-cast

10
推荐指数
1
解决办法
714
查看次数

检查交叉投射是否可行?

我知道dynamic_cast在类层次结构中进行"交叉投射" 是合法的.例如,如果我有类似这样的类:

  A   B
   \ /
    C
Run Code Online (Sandbox Code Playgroud)

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

A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);
Run Code Online (Sandbox Code Playgroud)

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

我提到这一点的原因是,在我写上面的代码的时候,它可能是编译器目前还没有看到的定义C,即使它看到的AB.这意味着编译器可能没有检测到A和之间的任何类型的连接B,但它仍然必须编译代码,因为它可能C存在类似的存在以及dynamic_cast在某些情况下成功.

问题是这意味着我可能会意外地交叉转换为错误类型的对象.假设我有类似这样的类:

A   B    D
 \ /   
  C
Run Code Online (Sandbox Code Playgroud)

在这里,D是一些随机无关的类.如果我尝试写这样的东西:

A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);
Run Code Online (Sandbox Code Playgroud)

那么这dynamic_cast将始终在运行时失败,因为有连接没有可能的方式A和 …

c++ static-analysis dynamic-cast cross-cast

8
推荐指数
1
解决办法
2277
查看次数