1

当我们进行动态转换时:

A* x = ...;
B* b = dynamic_cast<B*>(x);

只有在以下情况下,dynamic_cast 才会返回有效指针:

  1. A 是多态的,否则编译失败。
  2. B 等价于 A 或者从 A 派生B 应该在继承层次结构中与 A 有关系(虽然我不确定策略),否则返回 nullptr。这是根据评论更新的。
  3. *x 的 RTTI 表明它是 B 类的对象或 B 的派生类,否则返回 nullptr。

我正在考虑同时满足条件 1 和条件 3 的情况,但条件 2 除外。由于内存复制或 reinterpret_cast 等原因,这可能是可能的。以下所有讨论均基于此场景。

一个小例子在这里:http: //ideone.com/tBctgT

我可以这样说:如果在这种情况下 C++ 允许 dynamic_cast 成功,那么使用 dynamic_cast 返回的指针仍然是安全的吗?如果是这样,为什么 C++ 标准确定条件 2 的验证是强制性的?

此外,可以在编译时检查条件 2。为什么 C++ 标准决定在运行时返回 nullptr 而不是给出编译错误,如果它不被认为是正确的操作?

4

1 回答 1

1

我认为一个例子是最简单的:

class A { ... };
class B : public A { ... };
class C : public A { ... };

A *x = new C;
B *y = dynamic_cast<B *>(x);

第 1 点。

A 是一个类,它是多态的。

第 2 点。

dynamic_cast<>()编译时允许使用 ,因为 B 派生自 A 并且类型xA *

第 3 点。

dynamic_cast<>()返回 null 因为x不代表 B 类型的对象(或从 B 派生的类)。所以代码在运行时失败,你得到y == nullptr.

于 2014-05-25T05:34:33.047 回答