我知道使用dynamic_cast
跨类层次结构进行“交叉转换”是合法的。例如,如果我有如下所示的类:
A B
\ /
C
如果我有一个A*
指向 type 对象的指针C
,那么我可以使用
A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);
获取指向我指向的B
基础对象的指针。C
我提到这一点的原因是,在我编写上述代码时,编译器可能还没有看到 的定义,C
即使它已经看到了A
and B
。这意味着编译器可能没有检测到 and 之间的任何类型的连接A
,B
但它仍然必须编译代码,因为这样的类可能C
存在并且dynamic_cast
在某些情况下成功。
问题是这意味着我可能会意外地交叉转换为错误类型的对象。假设我有如下所示的类:
A B D
\ /
C
这里,D
是一些随机不相关的类。如果我尝试写这样的东西:
A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);
那么这dynamic_cast
在运行时总是会失败,因为没有办法连接A
和D
. 如果我D
因为我打算使用而意外使用B
,编译器将不会给我任何迹象表明我有一个毫无意义的演员表。
我的问题是:有什么方法可以让编译器警告我强制转换在运行时总是会失败? 对于可以检测到这一点的任何主要编译器,我都会对语言级解决方案或某些编译器设置感到满意。如果有外部工具,那也没关系;我只想知道是否有可能捕获此类错误。