当我们进行动态转换时:
A* x = ...;
B* b = dynamic_cast<B*>(x);
只有在以下情况下,dynamic_cast 才会返回有效指针:
- A 是多态的,否则编译失败。
B 等价于 A 或者从 A 派生B 应该在继承层次结构中与 A 有关系(虽然我不确定策略),否则返回 nullptr。这是根据评论更新的。- *x 的 RTTI 表明它是 B 类的对象或 B 的派生类,否则返回 nullptr。
我正在考虑同时满足条件 1 和条件 3 的情况,但条件 2 除外。由于内存复制或 reinterpret_cast 等原因,这可能是可能的。以下所有讨论均基于此场景。
一个小例子在这里:http: //ideone.com/tBctgT
我可以这样说:如果在这种情况下 C++ 允许 dynamic_cast 成功,那么使用 dynamic_cast 返回的指针仍然是安全的吗?如果是这样,为什么 C++ 标准确定条件 2 的验证是强制性的?
此外,可以在编译时检查条件 2。为什么 C++ 标准决定在运行时返回 nullptr 而不是给出编译错误,如果它不被认为是正确的操作?