我在C++中有以下情况:
Abstract1和Abstract2.他们是无关的.Foo来自推导Abstract1和Abstract2我在一个编译单元,我没有关于类的信息Foo(没有声明,没有定义).只有Abstract1而且Abstract2众所周知.(实际上,Foo甚至在DLL中定义)
将dynamic_cast的允许从铸造Abstract1*到Abstract2*?这是标准吗?
我知道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,即使它看到的A和B.这意味着编译器可能没有检测到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和 …