设计考虑C ++ dynamic_cast也检查指针或引用类型

时间:2014-05-25 04:28:29

标签: c++ dynamic-cast c++-standard-library language-concepts

当我们进行动态演员时:

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。
  4. 我正在考虑满足条件1和条件3的情况,条件2除外。这可能是因为内存复制或reinterpret_cast等。所有后续讨论都基于这种情况。

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

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

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

1 个答案:

答案 0 :(得分: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而x属于A *类型。

第3点。

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