c++ dynamic_cast的设计考虑也检查指针或引用类型
Design consideration of C++ dynamic_cast of also examining the pointer or reference type
当我们进行动态强制转换时:
A* x = ...;
B* b = dynamic_cast<B*>(x);
dynamic_cast只在以下情况下返回有效指针:
- A是多态的,否则编译失败。
B相当于A或派生自AB应该在继承层次结构中与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,而不是给出编译错误,如果它不被认为是一个正确的操作?
我想这里有一个最简单的例子:
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 *
类型。
点
dynamic_cast<>()
返回null,因为x
不代表B类型的对象(或从B派生的类)。所以代码在运行时失败,你得到y == nullptr
。
相关文章:
- 如何强制检查指针值
- 检查指针是否指向矢量元素
- 如何创建一个带锁的指针数组并检查指针是否空闲?
- 如何检查指针后面的对象是否有效或已删除?
- 如何检查指针是否在C 中删除
- 检查指针是否是带有变异模板的派生的指针
- C++ - 检查指针数组中的指针是否已"filled"
- 检查指针到向量C 内的对象
- 如何检查指针是否指向正确对齐的内存位置
- (C++) 检查指针数组中的空值
- 使用 new 并能够检查指针是否为 0(空)
- 如何检查指针指向的地址是否0x0?
- 检查指针是否为null,然后在同一if语句中取消引用它,这样安全吗
- 如何检查指针数组中的 c++ 对象指针是否已设置
- C++:另一个"检查指针是否为空"
- 如何在分配更多内存空间之前检查指针是否为 NULL
- x86-64上检查指针范围是否跨越N字节对齐地址的最快方法
- 检查指针句柄是否有效
- 如何在没有带布尔的包装的情况下检查指针是否有效
- C++ - 检查指针是否指向有效内存(此处不能使用 NULL 检查)