gpt4 book ai didi

c++ - 检查交叉转换是否可行?

转载 作者:可可西里 更新时间:2023-11-01 18:00:13 25 4
gpt4 key购买 nike

我知道使用 dynamic_cast 在类层次结构中进行“交叉转换”是合法的。例如,如果我有这样的类:

  A   B
\ /
C

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

A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);

获取指向 CB 基对象的指针。

我提到这一点的原因是,在我编写上述代码时,编译器可能还没有看到 C 的定义,即使它看到了 AB。这意味着编译器可能没有检测到 AB 之间的任何类型的连接,但无论如何它仍然必须编译代码,因为它可能是一个类C 存在并且 dynamic_cast 在某些情况下成功。

问题是这意味着我可能会不小心交叉转换为错误类型的对象。假设我有这样的类:

A   B    D
\ /
C

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

A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);

那么这个dynamic_cast 将在运行时总是失败,因为没有可能的方法连接AD。如果我不小心使用了 D,因为我打算使用 B,编译器将不会给我任何指示,表明我有一个无意义的转换。

我的问题是:有什么方法可以让编译器警告我转换在运行时总是失败吗?我很乐意使用语言级别的解决方案或某些编译器任何可以检测到这一点的主要编译器的设置。如果有外部工具,那也很好;我只想知道是否有可能捕获此类错误。

最佳答案

在编译时不可能检测到这一点。引入关系的 C 类可以在一个甚至还没有被编写的动态可加载库中找到,编译器不能证明不是这样。

虽然可能会有一些异常(exception)。如果 A 只有私有(private)构造函数(或私有(private)析构函数),那么编译器可以确定不会有未被 A 命名为友元的新子类。

关于c++ - 检查交叉转换是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5321664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com