我在这个页面上阅读它说
dynamic_cast 只能与对象的指针和引用一起使用。其目的是确保类型转换的结果是所请求类的有效完整对象。
但是当我这样做时,dynamic_cast 没有给出有效的对象:
struct A{};
struct B:A{};
void main(){
A a;
B b;
B* bPtr = (B*) 0x0000001;
A* aPtr = dynamic_cast<A*>(bPtr);
//Now aPtr is the memory address 0x00000001
}
由于 bPtr 不包含有效的 A 对象,我希望 dynamic_cast 使此转换失败,因此 aPtr 将变为 NULL。但这不是发生了吗?哪个是错误的,编译器(g++ 4.5.7)还是上面提到的网页?还是我错过了有关 dynamic_cast 实际上应该做什么的事情?
编辑:答案摘要
- 在 upcast 中,dynamic_cast 什么都不做。没有任何形式的保证。
- 在 downcast 中,dynamic_cast 不检查坏指针。它假定源指针为 0 或指向有效的源对象。(如果给定一个错误的指针,dynamic_cast 操作可能会在向下转换期间出现段错误)
- 通过 dynamic_cast 向下转型需要基类中至少有一个虚拟成员。