我正在阅读 this page它说
dynamic_cast can be used only with pointers and references to objects. Its purpose is to ensure that the result of the type conversion is a valid complete object of the requested class.
但是当我这样做时 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 什么都不做。没有任何形式的保证。
- 在向下转换中,dynamic_cast 不检查坏指针。它假定源指针为 0 或指向有效的源对象。 (如果给 dynamic_cast 操作一个错误的指针,它可能会在向下转换期间发生段错误)
- 通过 dynamic_cast 向下转换需要基类中至少有一个虚拟成员。
最佳答案
dynamic_cast<>
保证提供有效的对象,前提是它被正确使用。
使用此转换的第一个要求 是具有多态基类(至少 1 个 virtual
函数)。在您的示例中,A
和 B
不是多态的,会导致编译错误。
第二个要求是dynamic_cast<>
应该用于向下转换,在您的情况下,您将它用于向上转换(这种情况很常见)。
假设它们是多态的,那么第三个要求是在指向适当对象的指针/引用上使用此转换。
bPtr = (B*)0x0000001
不保证引用 B
的对象(主要是 UB) .
这是正确的例子:
struct A{ virtual ~A() {} };
struct B : A {};
void main(){
A* pA = new B;
B* pB = dynamic_cast<B*>(pA);
}
关于c++ - dynamic_cast 不保证一个有效的、完整的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10221814/