我知道使用是合法的dynamic_cast
跨类层次结构进行“交叉转换”。例如,如果我有如下所示的类:
A B
\ /
C
如果我有一个A*
指向类型对象的指针C
,那么我可以使用
A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);
得到一个指向B
的基础对象C
我指着。
我之所以提到这一点是因为在我编写上面的代码时,编译器可能还没有看到C
即使被看见A
and B
。这意味着编译器可能没有检测到之间的任何类型的连接A
and B
,但无论如何它仍然必须编译代码,因为对于像这样的类是可能的C
存在并为了dynamic_cast
在某种情况下取得成功。
问题是,这意味着我可能会意外地交叉转换到错误类型的对象。假设我有这样的类:
A B D
\ /
C
Here, D
是一些随机的不相关的类。如果我尝试写这样的东西:
A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);
那么这个dynamic_cast
在运行时总是会失败,因为没有可能的连接方式A
and D
。如果我正在使用D
意外地因为我打算使用B
,编译器不会给我任何指示,表明我有一个毫无意义的强制转换。
我的问题是:有什么方法可以让编译器警告我强制转换在运行时总是会失败吗?我很乐意为任何可以检测到这一点的主要编译器提供语言级解决方案或一些编译器设置。如果有外部工具也没关系;我只是想知道是否有可能捕获此类错误。
在编译时不可能检测到这一点。班上C
引入关系的内容可以在尚未编写的动态可加载库中找到,并且编译器无法证明其他情况。
但可能也有一些例外。如果A
只有私有构造函数(或私有析构函数),那么编译器可以确定不会有未命名为友元的新子类A
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)