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

Design consideration of C++ dynamic_cast of also examining the pointer or reference type

本文关键字:检查 指针 引用类型 dynamic cast c++      更新时间:2023-10-16

当我们进行动态强制转换时:

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,而不是给出编译错误,如果它不被认为是一个正确的操作?

我想这里有一个最简单的例子:

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