当我们进行动态演员时:
A* x = ...;
B* b = dynamic_cast<B*>(x);
只有在以下情况下,dynamic_cast才会返回有效指针:
我正在考虑满足条件1和条件3的情况,条件2除外。这可能是因为内存复制或reinterpret_cast等。所有后续讨论都基于这种情况。
这里有一个小例子:http://ideone.com/tBctgT
我可以这样说:如果在这种情况下C ++允许dynamic_cast成功,那么使用dynamic_cast返回的指针仍然是安全的吗?如果是这样,为什么C ++标准确定条件2的验证是强制性的?
此外,可以在编译时检查条件2。为什么C ++标准确定在运行时返回nullptr而不是在不认为是正确的操作时给出编译错误?
答案 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
。